如何解决为什么迭代器不经过第一个 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());
解决方法
您的问题是使用 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 举报,一经查实,本站将立刻删除。