鉴于约瑟夫斯的问题。
约瑟夫斯问题N个人(编号1到N)站在一个圆圈里。人1用剑杀死人2,把剑给人3。人3杀人4,剑给人5。这个过程重复,直到只有一个人还活着。任务:(中)给定人数N,编写一个程序来找出在最后仍然活着的人的数量。(硬)显示流程的每一步。(索洛尔学习申请的描述)“
这是我的密码。forEachRemaining方法的解决方案是否正确?我不得不用这个继承的方法做点什么,但它没有任何意义。
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.function.Consumer;
class CyclicIterator implements Iterator {
private final List list;
private Iterator iterator;
public CyclicIterator(List list) {
this.list = list;
initIterator(list);
}
private void initIterator(List list) {
this.iterator = list.iterator();
}
@Override
public boolean hasNext() {
return !list.isEmpty();
}
@Override
public Object next() {
if (!this.iterator.hasNext())
initIterator(list);
return this.iterator.next();
}
@Override
public void remove() {
this.iterator.remove();
}
@Override
public void forEachRemaining(Consumer action) {
throw new UnsupportedOperationException("This method has no meaning in CyclicIterator class!");
}
}
public class JosephusProblem {
public static void main(String[] args) {
execution(0);
execution(1);
execution(2);
execution(4);
execution(6);
}
private static void execution(int members) {
if (members < 1) {
System.out.println("The parameter (members) has to be bigger than 0!");
return;
}
if (members == 1) {
System.out.println("There is olny one person, so he is the survivor. Peaceful version! :)");
return;
}
LinkedList<Integer> list = new LinkedList();
for (int index = 0; index < members; index++)
list.add(index + 1);
Iterator<Integer> it = new CyclicIterator(list);
System.out.println("For " + members + " members: ");
while (members-- > 1) {
System.out.print(it.next() + " kills " + it.next() + ", ");
it.remove();
}
System.out.println("\n The survivor: " + it.next());
}}
发布于 2018-12-16 08:39:43
缩进是关闭的:在class之后也应该有一个级别,而不仅仅是在方法中:
class CyclicIterator {
// Class members here
}始终尝试实例化接口,而不是实例化实现:
LinkedList<Integer> list = new LinkedList();应:
List<Integer> list = new LinkedList<>();注意,菱形操作符<>实际上得到了一个泛化的列表。如果没有它,就应该有一个编译器警告您使用原始列表。菱形操作符是将泛型类型赋予实现:List<Integer> list = new ArrayList<Integer>();的缩写。
我也更喜欢使用System.out.format,而不是在println调用:System.out.format("For members %s:%n");中将字符串分解在一起。
发布于 2018-11-15 05:04:20
forEachRemaining的文档声明该行为相当于
while (hasNext())
action.accept(next());为什么不直接把它放在那里呢?
https://codereview.stackexchange.com/questions/207657
复制相似问题