2 u010581514 u010581514 于 2015.07.14 07:48 提问

java迭代问题,二次迭代问题i

import java.util.Iterator;
import java.util.NoSuchElementException;

public class MyArrrayList implements Iterable {
private static final int DEFAULT_CAPACITY = 10;
private int theSize;
private AnyType[] theItems;

public MyArrrayList() {
    clear();
}

public void clear() {
    theSize = 0;
    ensureCapality(DEFAULT_CAPACITY);
}

public int size() {
    return theSize;
}

public boolean isEmpty() {
    return size() == 0;
}

public void trimSize() {
    ensureCapality(size());
}

public AnyType get(int idx) {
    if (idx < 0 || idx >= size())
        throw new ArrayIndexOutOfBoundsException();
    return theItems[idx];
}

public AnyType set(int idx, AnyType newVal) {
    if (idx < 0 || idx >= size())
        throw new ArrayIndexOutOfBoundsException();
    AnyType old = theItems[idx];
    theItems[idx] = newVal;
    return old;
}

@SuppressWarnings("unchecked")
public void ensureCapality(int newCapality) {
    if (newCapality < theSize)
        return;
    AnyType[] old = theItems;
    theItems = (AnyType[]) new Object[newCapality];
    for (int i = 0; i < size(); i++) {
        theItems[i] = old[i];
    }
}

public boolean add(AnyType x) {
    add(size(), x);
    return true;
}

public void add(int idx, AnyType x) {
    if (theItems.length == size())
        ensureCapality(size() * 2 + 1);
    for (int i = theSize; i > idx; i--)
        theItems[i] = theItems[i - 1];
    theItems[idx] = x;
    theSize++;
}

public AnyType remove(int idx) {
    if (idx < 0 || idx >= size())
        throw new ArrayIndexOutOfBoundsException();
    AnyType removeItem = theItems[idx];
    for (int i = idx; i < theSize; i++)
        theItems[i] = theItems[i + 1];
    theSize--;
    return removeItem;
}

@Override
public Iterator<AnyType> iterator() {
    // TODO Auto-generated method stub
    return new ArrayListIterator(this);
}

private static class ArrayListIterator<AnyType> implements Iterator<AnyType> {
    private int current = 0;
    private MyArrrayList<AnyType> theList;
    public ArrayListIterator(MyArrrayList<AnyType> list){
        theList=list;
    }

    public boolean hasNext() {
        return current < theList.size();
    }

    public AnyType next() {

        return theList.theItems[current++];
    }

    public void remove() {
        theList.remove(--current);
    }
}

public static void main(String[] args) {
    MyArrrayList<Integer> list=new MyArrrayList<Integer>();
    for(int i=1;i<20;i++)
    list.add(i);

    Iterator<Integer> it=list.iterator();
    while(it.hasNext())
    {
        System.out.print(it.next());
        System.out.print(" ");

    }
    Iterator<Integer> its=list.iterator();


    while(it.hasNext())
    {
        System.out.println(it.next());
    }


}

}
请问我的输出为:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
明明写了两个输出语句,为什么只有一个输出呢?

7个回答

strutce
strutce   Ds   Rxr 2015.07.14 08:58
已采纳

Iterator its=list.iterator();

while(it.hasNext())
{
    System.out.println(it.next());
}

第二个你参数写错了 应该是its.hasNext()

u010581514
u010581514 对啦!谢谢!!就是我其他没错是不是啊?
大约 3 年之前 回复
strutce
strutce 还有 its.next() 这2个
大约 3 年之前 回复
richper_6
richper_6   2015.07.14 08:09

hasnext 已经指向最后一个了下一个自然不满足条件

jcc741486706
jcc741486706 有没有办法改进
大约 3 年之前 回复
u012216727
u012216727   Ds   Rxr 2015.07.14 08:22

应该是hasnext的原因,你不能改成别的吗

jcc741486706
jcc741486706 不会改~=_=不知道怎么改
大约 3 年之前 回复
lingfeiwen
lingfeiwen   2015.07.14 09:38

三楼只正解。

第一个迭代器在第一个循环里面已经指向最后一个元素了。第二个循环还用第一个迭代器去取元素,当然就取不到了。应该用新的迭代器就可以。

zmbc48
zmbc48   2015.07.14 09:44

先用it.hasNext() 判断集合里是不是已经没有元素了
如果有就用
it.next();
就是取得当前集合的元素 然后把指针往后移一位指向下一个元素(java确实还是有指针的只不过你不能自己调用罢了)
指针指完了就没有了,所以后面就进不去了,如果你还想打印可改为
it =list.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}

zmbc48
zmbc48   2015.07.14 09:44

先用it.hasNext() 判断集合里是不是已经没有元素了
如果有就用
it.next();
就是取得当前集合的元素 然后把指针往后移一位指向下一个元素(java确实还是有指针的只不过你不能自己调用罢了)
指针指完了就没有了,所以后面就进不去了,如果你还想打印可改为
it =list.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}

ujnlvxin
ujnlvxin   2015.07.14 21:18

it,its。没有区分,接着对it取hasnext肯定是假啊

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
递归3: 汉诺塔的递归与迭代实现
递归实现与main(): /*------------------------------------------------------ 汉诺塔主要是有三个塔座X,Y,Z,要求将从小到大编号为 1,2.....n 的 圆盘从X移动到塔座Z上,要求  (1):每次只能移动一个圆盘  (2):圆盘可以插到X,Y,Z中任一塔座上  (3):任何时候不能将一个较大的圆盘压在较小的圆盘之上 初始:所有
递归和迭代算法 [汉诺塔问题]
递归的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己. 一个函数在其定义中直接或间接调用自身的一种方法,它通常把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决,可以极大的减少代码量.递归的能力在于用有限的语句来定义对象的无限集合. 使用递归要注意的有两点: 1)递归就是在过程或函数里面调用自身; 2)在使用递归时,必须有一个明确的递归结束条件,称为递归出口.
每天一道算法--经典兔子繁殖迭代问题(斐波那契数列)
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21…. 由规律可知: f(x) = f(x-1)+f(x-2) 符合斐波那契数列(斐波那契数列系数就由之前的两数相加)public class Rabbit { priv
迭代解决装载问题
王晓东算法书第五章装载问题,迭代法解决
第二次迭代个人总结
新年晚会后,软工课程的微信开发总算是结束了,总的来说,收获还是很多的。   1.        微信抢票 1)        从一个想法落实到具体实现的过程: 我们小组微信抢票部分最有特色的就是个人中心的整合以及双人抢票了,一开始规划愿景的时候大家就又很多想法,就拿双人墙票来说,如何实现,经过我们小组成员的一起讨论以及与团委、老师助教的交流之后,至少提出了四五种方案,在迭代一时我们采取了令
迭代和非线性
一直以来我都是以系统的角度去看待问题,对于形成一个新系统以及这个系统变得更强大,不断涌现出新的功能来的必要元素是什么这个问题一直以来都在我的脑子里转来转去。最近的思考结果是一个系统如果想要变得越来越强大,那么必然不能缺少两个最基础的方法或者特征就是:一,不断的迭代(包括在空间上的迭代和时间上的迭代),二,基础性的构件或者规则应该表现出差异性。我想要研究的问题是如何通过最简单的规则,最简单的构件构造
java迭代输出是穿参需谨慎!!
今天面试题:输出部门信息到控制台,部门自关联,要求在控制台上能看的出来层级关系 , 要求递归输出;实体类大概描述为: 。。 class Dep{ private int id; private String name; .. private list list; //get&set// } 费了九牛二虎之力终于生成了一个只装载顶级部门的list,但是递归输出的时候发现前边
Java多线程之迭代器问题(四)
1.迭代器的问题无论是直接迭代还是for-each循环(for-each内部也是用迭代器实现)语句,对容器迭代的标准方式都是Iterator。但是,即使是使用迭代器,也无法避免在迭代器在迭代期间对容器加锁。这是因为设计同步容器的迭代器时并没有考虑并发修改的问题。它们表现出的行为是及时失败的,也就是容器在迭代的过程中如果被修改,就会抛出ConcurrentModificationException失败
迭代式汉诺塔(利用栈实现非递归)
汉诺塔问题的描述:   汉诺塔(Tower of Hanoi)问题又称“世界末日问题”有这样一个故事。古代有一个焚塔,塔内有3个基座A,B,C,开始时A基座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移到B座,但每次只容许移动一个盘子,且在移动过程中,3个基座上的盘子都始终保持大盘在下,小盘在上。移动过程中可以利用C基座做辅助。      这个问题
关于java进行迭代时更改迭代集合的问题
关于 问题描述 解决方法 结论 关于 在这次实验中遇到了一个在迭代器中remove时候的bug,注意到老师上课讲过,今天自己用代码测试了一下,果然有问题。 问题描述 如果直接利用foreach迭代,在迭代过程中,如果在迭代的集合上进行更改,例如remove,add等方法,编译时就会报错 例如,写一个ArrayList的代码如下: List&amp;lt;Integer&amp;gt; li...