A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张先龙 中级黑马   /  2013-4-5 20:11  /  1700 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张先龙 于 2013-4-6 08:36 编辑

为什么一下程序的结果是这样的:
code:
import java.util.*;
public class Test {
  public static void main (String args[]) {
   String elements[] = {"Apple", "Samsung", "Lenovo", "MOTO"};
    int i=0;
   List list = new LinkedList(Arrays.asList(elements));
   ListIterator iter = list.listIterator(list.size());
   while(iter.hasPrevious()){
       if (iter.previous().equals("Samsung")){
           iter.set("aa");
      }
       System.out.println(iter.previous());  
   } } }

输出结果:
Lenovo
Apple
为什么 MOTO 没输出来? 但是如果我没用set的话 就有输出

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

5 个回复

倒序浏览
本帖最后由 刘焕新 于 2013-4-5 21:08 编辑

因为迭代器遍历集合里的元素时,previous()方法被调用一次之后,下一次再调用它时,它读取的将是集合中的下一个元素。

你在while的每次循环里调用了两次previous方法,但只有一次打印输出,所以只看到一半的元素。
  1. import java.util.*;

  2. public class ClassTest {
  3.         public static void main(String args[]) {
  4.                 String elements[] = { "Apple", "Samsung", "Lenovo", "MOTO" };
  5.                 int i = 0;
  6.                 List list = new LinkedList(Arrays.asList(elements));
  7.                 ListIterator iter = list.listIterator(list.size());
  8.                 while (iter.hasPrevious()) {
  9.                         //为了避免之前的情况,每次循环内部,只调用一次previous()方法:
  10.                         String s = (String)iter.previous();
  11.                         System.out.println("original:"+s);
  12.                         if (s.equals("Samsung")) {
  13.                                 iter.set("aa");
  14.                         }
  15.                 }
  16.                
  17.                 //用增强for循环重新遍历,打印看看:
  18.                 for(Object o : list) {
  19.                         System.out.println(o);
  20.                 }
  21.         }
  22. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
肯定是这样啊,iter.previous()指的是前一个元素,你在if (iter.previous().equals("Samsung"))这里调用了iter.previous(),判断的是"MOTO“,输出时又写了一遍,它就输出了前边的 "Lenovo”,一次类推,后边的也是
回复 使用道具 举报
  1. public static void main(String[] args) {
  2.                 String elements[] = {"Apple", "Samsung", "Lenovo", "MOTO"};
  3.             int i=0;
  4.            List list = new LinkedList(Arrays.asList(elements));
  5.            ListIterator iter = list.listIterator(list.size());
  6.            while(iter.hasPrevious()){
  7.                    Object o = iter.previous(); //把前一个对象,存起来。
  8.                if (o.equals("Samsung")){
  9.                    iter.set("aa");
  10.               }
  11.                System.out.println(o);  
  12.            }
  13.         }
复制代码
while(iter.hasPrevious()){
       if (iter.previous().equals("Samsung")){//调用一次
           iter.set("aa");
      }
       System.out.println(iter.previous());//调用一次

你连续调用两次,MOTO肯定看不见。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
不对啊!我按照你这个程序吧set去了输出的结果就是  "Apple", "Samsung", "Lenovo",
  1. import java.util.*;

  2. public class Test {
  3.         public static void main(String args[]) {
  4.                 String elements[] = { "Apple", "Samsung", "Lenovo", "MOTO" };
  5.                
  6.                 @SuppressWarnings("unused")
  7.                 int i = 0;
  8.                 List<String> list = new LinkedList<String>(Arrays.asList(elements));
  9.                 ListIterator<String> iter = list.listIterator(list.size());
  10.                 while (iter.hasPrevious()) {
  11.         //                if (iter.previous().equals("Samsung")) {
  12.         //                        iter.set("aa");
  13.         //                }
  14.                         System.out.println(iter.previous());
  15.                 }
  16.         }
  17. }
复制代码
下面是我查询的API你仔细看看,如果你发现我哪回答的不好 希望得到你的回复!!!!

previous()返回列表中的前一个元素。可以重复调用此方法来迭代列表,或混合调用 next 来前后移动(注意交替调用 next 和 previous 将重复返回相同的元素)。

返回:
列表中的上一个元素。

void set(E e)用指定元素替换 next 或 previous 返回的最后一个元素(可选操作)。只有在最后一次调用 next 或 previous 后既没有调用 ListIterator.remove 也没有调用 ListIterator.add 时才可以进行该调用。

参数:
e - 用于替换 next 或 previous 返回的最后一个元素的元素。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
为什么一下程序的结果是这样的:
code:
import java.util.*;
public class Test {
  public static void main (String args[]) {
   String elements[] = {"Apple", "Samsung", "Lenovo", "MOTO"};
    int i=0;
   List list = new LinkedList(Arrays.asList(elements));
   ListIterator iter = list.listIterator(list.size());
   while(iter.hasPrevious()){
       if (iter.previous().equals("Samsung")){
           iter.set("aa");
      }
       System.out.println(iter.previous());  
   } } }
iter.hasPrevious()是从后面判断元素是否存在,iter.previous()是获取元素
hasnext()是从前面判断元素是否存在,next()是获得元素。
iter.previous()每调用一次就会向前移动一次,而在
if (iter.previous().equals("Samsung")){
           iter.set("aa");
      }
       System.out.println(iter.previous());  
中调用了两次所以只有两个值。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马