这个是用集合类写的,建议你多用集合类少用数组,从整个Java的api上来看,对集合类的支持要好于数组
成都创新互联公司是一家专业提供平和企业网站建设,专注与成都网站制作、成都网站设计、H5场景定制、小程序制作等业务。10年已为平和众多企业、政府机构等服务。创新互联专业网站制作公司优惠进行中。
Josephus(1, 9, 5) 这个构造方法的意思 从第1个人开始报数,一共9个人,数到5的人出列
用了一个Iterator,不用也可以
List选用了LinkedLisk,用ArrayList或Vector也可以
没有仔细想,有问题再交流
import java.util.Iterator;
import java.util.LinkedList;
public class Main {
public static void main(String[] args) {
Josephus test = new Josephus(1, 9, 5);
for (Integer i : test) {
System.out.println(i);
}
}
}
class Josephus implements IterableInteger {
private LinkedListInteger stack;
private int first; //从第几个人开始
private int key; //数几个
private int capacity; //一共几个人
public Josephus(int first, int capacity, int key) {
this.first = first;
this.capacity = capacity;
this.key = key;
this.stack = new LinkedListInteger();
for (int i = 1; i = this.capacity; i++) {
this.stack.add(i);
}
for (int i = 0; i this.first - 1; i++) {
this.stack.add(this.stack.remove());
}
}
public Iterator iterator() {
return new Itr();
}
class Itr implements IteratorInteger {
public boolean hasNext() {
return !stack.isEmpty();
}
public Integer next() {
for (int i = 0; i key - 1; i++) {
stack.add(stack.remove());
}
return stack.remove();
}
public void remove() {
throw new UnsupportedOperationException("Not supported yet.");
}
}
}
你的iter=all.iterator();这句后少了iter.next(); 如果不指向一个元素那你的iter.remove(); 就不知道要删除那个元素了,所以获取新迭代器后要用next方法指定删除的是哪个,否则会抛出异常的。
for(int i=0;i3;i++){
if(iter.hasNext())
iter.next();
else{
iter=all.iterator();
iter.next();
}
}
问题出在数组下表越界,但是我忘了约瑟夫环是怎么弄得了,具体讲就是j+i的值不能比你声明的数组a[12]还要大,刚才我试了下,在最内层的循环执行第2次时,j+i的值为13,产生了越界