题目是这样的:集合中有七个元素,然后用一个变量count从0开始自增同时遍历这个集合,当这个count%3==0的时候,将当前遍历到的元素remove掉,一直这么遍历下去,直到集合只剩下最后个元素为止。
我写了两个实现的方法
一般for循环LinkedList<String> l = new LinkedList<String>();
  l.add("大毛");
  l.add("二毛");
  l.add("三毛");
  l.add("四毛");
  l.add("五毛");
  l.add("六毛");
  l.add("小毛");
int n = 0;
while(l.size()>1){
for(int j=0;j<l.size();j++){
n++;
if(n%3==0){
l.remove(j);
}
}
}
System.out.println("最后留下的是---->"+l.get(0));//此时返回的是六毛
用Iterator迭代LinkedList<String> l = new LinkedList<String>();
l.add("大毛");
l.add("二毛");
l.add("三毛");
l.add("四毛");
l.add("五毛");
l.add("六毛");
l.add("小毛");
Iterator<String> i = l.iterator();
int n = 0;
while(l.size()>1){
n++;
i.next();
if(n%3==0){
i.remove();
}
if(!i.hasNext()){
i = l.iterator();
}
}
System.out.println("最后剩下的元素是---->"+l.get(0));//返回的是四毛我想问下这两个循环的差别在哪里?

解决方案 »

  1.   

    for一般用于循环顺序存储,遍历的对象可以是集合,也可以是数组。
    iterator用于链式存储,遍历的对象必须是集合。实际上,for也是基于iterator实现的,所有效率上,iterator应该高于for
      

  2.   

    使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。所以遍历的结果是无序的。
      

  3.   

    Iterator也是有序的,唯一的差别在于remove之后下标会回退,相当于在你第一个程序"l.remove(j);"之后做了一次"j--"。你可以试试这样修改第一个程序,这样运行结果会和第二个程序一样的。
      

  4.   


    去看Iterator的实现就知道了
      

  5.   

    在for循环时remove对象时,他的list.size()是变化的,而j是不会改变的,这样会有的没有被遍历到,楼主第一种方法可以试试倒序的方式遍历for(int j=l.size-1;j>=0;j--){)
      

  6.   

    用你的方法行了,运行结果和第二个一样。小弟还有一问,用Iterator迭代,remove一个元素掉,后面的元素不会往前挪一位么?那它是用什么填充这一位的?
      

  7.   

    remove之后next()返回不为空就说明已经补位了Iterators allow the caller to remove elements from the underlying collection during the iteration with well-defined semantics.
      

  8.   


    int n = 0;
    while (l.size() > 1) { for (int j = 0; j < l.size(); j++) {
    System.out.println("list length  before remove:" + l.size());
    n++;
    if (n % 3 == 0) {
    System.out.println("remove element:" + l.get(j)) ;
    l.remove(j);
    System.out.println("list length after remove:" + l.size());
    }
    }
    }
    结果:list length  before remove:7
    list length  before remove:7
    list length  before remove:7
    remove element:三毛
    list length after remove:6
    list length  before remove:6
    list length  before remove:6
    list length  before remove:6
    remove element:小毛分析:
    for循环list列表,在使用remove或者add操作时,就会实时改变list的长度。正如LZ所写实例demo,在remove掉元素之后,后面的元素就会自动补充上来,索引号就会改变。就像这个实例demo那样,本来第二次移除的索引号为5,而get(5)在remove之前是六毛,但是经过remove之后,get(5)就变成小毛了,因为它的索引位置提前了一位。按照这个思路解释就很好理解为什么最后打印出来的结果是六毛。
    而迭代iterator始终获取next,本demo就像是环形链,满足条件就remove一个,但是始终是next操作,顺序操作,不会像for那样,删除的元素已经提前了,潜移默化地元素被漏掉了。
      

  9.   

    next的操作特点是什么,删除元素后,后面的元素不会往前挪一位?
      

  10.   

    很显然,题目是让你遍历集合
    遍历集合的方式是什么集合元素remove掉以后,是否还占位??正常的情况是remove掉一个元素,集合重新调整,而不是把那个空位置留下来我认为第一种方式是对的
      

  11.   

    如果让你把元素替换为特定字符,如“ ”那么list.size不变,结果就是另一个
      

  12.   

    我上面已经说得很详细了,而且我还重新写了一遍。
    import java.util.LinkedList;public class Test {
    public static void main(String[] args) {
    LinkedList<String> l = new LinkedList<String>();
    l.add("大毛");
    l.add("二毛");
    l.add("三毛");
    l.add("四毛");
    l.add("五毛");
    l.add("六毛");
    l.add("小毛");
    int n = 0;
    int count = 0;
    for (int j = 0; j < 100; j++) {
    if (!"出局".equals(l.get(j % 7))) {
    n++;
    }
    if (n % 3 == 0 && !l.get(j % 7).equals("出局")) {
    l.set(j % 7, "出局");
    count++;
    if (count == 6) {
    break;
    }
    }
    } for (String s : l) {
    if (!"出局".equals(s)) {
    System.out.println("最后留下的是---->" + s);// 此时返回的是四毛
    }
    } }
    }
      

  13.   

    你在说什么
    我只是想问,用Iterator迭代时,删除其中的元素的时候,为什么后面的元素不会往前挪一位。是什么原因?是原因!!!