题目是这样的:集合中有七个元素,然后用一个变量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));//返回的是四毛我想问下这两个循环的差别在哪里?
我写了两个实现的方法
一般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));//返回的是四毛我想问下这两个循环的差别在哪里?
iterator用于链式存储,遍历的对象必须是集合。实际上,for也是基于iterator实现的,所有效率上,iterator应该高于for
去看Iterator的实现就知道了
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那样,删除的元素已经提前了,潜移默化地元素被漏掉了。
遍历集合的方式是什么集合元素remove掉以后,是否还占位??正常的情况是remove掉一个元素,集合重新调整,而不是把那个空位置留下来我认为第一种方式是对的
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);// 此时返回的是四毛
}
} }
}
我只是想问,用Iterator迭代时,删除其中的元素的时候,为什么后面的元素不会往前挪一位。是什么原因?是原因!!!