【问题标题】:List Iterator getting stuck-Java列表迭代器卡住-Java
【发布时间】:2013-05-26 22:47:45
【问题描述】:

我有一个包含以下数据的文件

1^ 我讨厌那部手机,它从来没有按照我说的去做,响应时间很慢,网络,并且会不断地崩溃,因为我会在手机上加载太多的应用程序或视频,我认为我的豆荚应该是为媒体驱动的人准备的。如果您不介意手机被锁定或每隔几天就必须将其恢复出厂设置。#

2^ 该设备是第一款真正有很多工作要做的高级设备,漏洞非常少,并且是所有智能手机中最好的浏览器。 I phone 3G 和 3G 革新了我们今天制造智能手机的方式。#


每行用“#”分隔,每行用“^”分隔 我将它们存储在列表中并打印它们。 代码(如下所示)正在正确打印 2 行,但之后卡住并且没有退出。我不知道问题出在哪里。请帮忙。

        FileReader fr=new FileReader("comments.csv");
        Scanner sc= new Scanner(fr);
        sc.useDelimiter("#");

        ArrayList<ArrayList<String>> listoflists= new ArrayList<ArrayList<String>>();
        ArrayList<String> singlist= new ArrayList<String>();

        while(sc.hasNext())
        {
            String line=sc.next();
            String[] element=line.split("\\^");
            for( int i=0; i< element.length;i++)
            {
                singlist.add(element[i]);
                bw.write(element[i]);
                bw.newLine();
                //System.out.print(element[i]+"\n");
            }
            listoflists.add(singlist);

        }
    // it running properly till this part without getting stuck in infinite loop
        ListIterator<String> iter1=singlist.listIterator();
        ListIterator<ArrayList<String>> iter2=listoflists.listIterator();
        while(iter2.hasNext())
        {
            while(iter1.hasNext())
            {
                System.out.println(iter1.next());
            }
        }

谢谢

【问题讨论】:

  • iter2 未转发;所以 iter2.hasNext() 将永远为真。在某处调用 iter2.next()
  • 使用 foreach 循环避免此类错误:for (List&lt;String&gt; singleList : listOfLists) { for (String s : singleList) { ... }}
  • @vpram86 成功了!谢谢,但是如果指针没有转发,迭代器如何打印第二行数据?(因为我将这两行都作为输出):/
  • 第一个 while 是真的,所以我们去第二个。也是真的,所以我们打印第一个值,然后它又是真的,所以我们打印第二个值,然后它是假的,所以我们回到第一个while,没有别的可做,但它仍然是真的,所以我们再次输入它,但第二个 while 是假的,我们什么也不做,并完成第一个 while,这仍然是真的,所以我们输入它并...

标签: java file arraylist listiterator


【解决方案1】:

这段代码是无限循环的:

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

因为您不会移动到iter2 并且它总是指示第一项。

这应该可以解决问题:

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

【讨论】:

    【解决方案2】:

    我认为你想做的是

    ListIterator<ArrayList<String>> iter2 = listoflists.listIterator();
    while(iter2.hasNext()){
        List temp = iter2.nextElement();
        ListIterator<String> iter1 = temp.listIterator();
        while(iter1.hasNext()){
             System.out.println(iter1.next());
        }
    }
    

    【讨论】:

    • 成功了!谢谢,但是如果指针没有转发,迭代器如何打印第二行数据?(因为我将这两行都作为输出)
    【解决方案3】:

    你没有调用 iter2.next(),所以它会无限迭代。

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

    【讨论】:

      【解决方案4】:

      显然没有解决您的问题,

      我认为,如果你想再次阅读你准备好的列表,应该从 listoflist 中读取 singleList

          ListIterator<ArrayList<String>> iter2=listoflists.listIterator();
          while(iter2.hasNext())
          {
              ListIterator<String> iter1=(ArrayList<String>)iter2.next();  
              while(iter1.hasNext())
              {
                  System.out.println(iter1.next());
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-19
        相关资源
        最近更新 更多