首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带循环迭代器的Josephus问题

带循环迭代器的Josephus问题
EN

Code Review用户
提问于 2018-11-14 13:27:46
回答 2查看 571关注 0票数 0

鉴于约瑟夫斯的问题。

约瑟夫斯问题N个人(编号1到N)站在一个圆圈里。人1用剑杀死人2,把剑给人3。人3杀人4,剑给人5。这个过程重复,直到只有一个人还活着。任务:(中)给定人数N,编写一个程序来找出在最后仍然活着的人的数量。(硬)显示流程的每一步。(索洛尔学习申请的描述)“

这是我的密码。forEachRemaining方法的解决方案是否正确?我不得不用这个继承的方法做点什么,但它没有任何意义。

代码语言:javascript
复制
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());
}

}

EN

回答 2

Code Review用户

回答已采纳

发布于 2018-12-16 08:39:43

缩进是关闭的:在class之后也应该有一个级别,而不仅仅是在方法中:

代码语言:javascript
复制
class CyclicIterator {
    // Class members here
}

始终尝试实例化接口,而不是实例化实现:

代码语言:javascript
复制
LinkedList<Integer> list = new LinkedList();

应:

代码语言:javascript
复制
List<Integer> list = new LinkedList<>();

注意,菱形操作符<>实际上得到了一个泛化的列表。如果没有它,就应该有一个编译器警告您使用原始列表。菱形操作符是将泛型类型赋予实现:List<Integer> list = new ArrayList<Integer>();的缩写。

我也更喜欢使用System.out.format,而不是在println调用:System.out.format("For members %s:%n");中将字符串分解在一起。

票数 2
EN

Code Review用户

发布于 2018-11-15 05:04:20

forEachRemaining的文档声明该行为相当于

代码语言:javascript
复制
while (hasNext())
    action.accept(next());

为什么不直接把它放在那里呢?

票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/207657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档