微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么迭代器不经过第一个 while?

如何解决为什么迭代器不经过第一个 while?

我试图在列表中找到相同的行并将它们组合成组。(这类似于非集合的发现)。

A1;B1;C1

A2;B2;C2 ...

找到一组唯一的字符串,并按照以下标准将其分成不相交的组: 如果两行在一列或多列中有匹配的非空值,则它们属于同一组。

111;123;222

200;123;100

300;;100

都属于同一组,因为前两行在第二列中具有相同的值 123,而后两行在第三列中具有相同的值 100。

private static Map<String,List<List<String>>> findGroupe1(List<List<String>> 
lines)
{
    Map<String,List<List<String>>> map=new HashMap<>();
    ListIterator listIterator=lines.listIterator();
    int count=0;
    while (listIterator.hasNext()){
        List<String>list1= (List<String>) listIterator.next();
        count++;
        map.put("Group :"+count,new ArrayList<>());
        map.get("Group :"+count).add(list1);
        while (listIterator.hasNext())
        {
            List<String>list2= (List<String>) listIterator.next();
            if(isAnyFieldMatches(list1,list2)&&list1!=list2)
            {
                map.get("Group :"+count).add(list2);
                listIterator.remove();
            }
        }
    }
    return  map;
}

          private static boolean isAnyFieldMatches(List<String> list1,List<String> list2)
            {   boolean b=false;
                for(int i=0;i<list1.size();i++)
                {
                    for(int j=0;j<list2.size();j++)
                    {
                        if(list1.get(i).equals(list2.get(j))) {                          
                            b = true;
                            break;
                        }
                    }
                }
                return b;
            }

我找到了组,但不是全部,因为迭代器在传入第二个 while 后,转到第一个退出它。例如:

List<List<String>> lines=new ArrayList<>();
    List<String>list1=new ArrayList<>();
    list1.add("A");
    list1.add("B2");
    list1.add("C3");
    List<String>list2=new ArrayList<>();
    list2.add("C1");
    list2.add("B2");
    list2.add("K3");
    List<String>list3=new ArrayList<>();
    list3.add("D1");
    list3.add("B2");
    list3.add("C3");
    List<String>list4=new ArrayList<>();
    list4.add("X1");
    list4.add("R2");
    list4.add("Y3");
    lines.add(list1);lines.add(list2); lines.add(list3); lines.add(list4);

    Map<String,List<List<String>>> map=findGroupe1(lines);
    System.out.println(map.toString());

列表 4 不属于一个单独的组,我该如何解决

解决方法

您的问题是使用 iterator.next() 将光标移动到下一个元素,因此在您的第二个(=inner)while 循环中,您将迭代器的光标移动到列表的末尾,因此当您的第二个while 循环退出并且代码返回到外部 while 循环,迭代器已经在列表的末尾。

我会使用两个单独的迭代器,一个用于 “遍历每一行”和第二个用于“检查每隔一行”(并且必须为第一个迭代器的每个元素再次初始化第二个迭代器。

有点像

private static Map<String,List<List<String>>> findGroupe1(List<List<String>> lines) {
    ListIterator<List<String>> outerIterator = lines.listIterator();
    while (outerIterator.hasNext()) {
        List<String> currentLine = outerIterator.next();
        ListIterator<List<String>> innerIterator = lines.listIterator();

        while (innerIterator.hasNext()) {
            List<String> lineToCheck = innerIterator.next();
            System.out.println(lineToCheck);
            //check currentLine with lineToCheck
        }
    }
    return null;
} 

顺便说一句,如果不是必需的,我绝对不会使用迭代器来解决这类问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。