所以我有ArrayList
名为originalList
,如下所示:
[pans,naps,pots,sit,it's,tis,snap]
我还有ArrayList
名为modifiedList
,看起来像
[anps,anps,opst,ist,ist,ist,anps]
修改后的列表采用原始列表,删除标点符号并对其进行排序。此程序的目的是获取输入(originalList
)并查看输入中是否存在字谜。字谜是由相同字母组成的单词。我的循环中出现问题,打印出字谜。这是循环:
for (int i=0; i<modifiedList.size();i++){
System.out.print(originalList.get(i));
for (int j=i+1;j<modifiedList.size();j++){
if (modifiedList.get(i).contentEquals(modifiedList.get(j))){
System.out.print(" "+ originalList.get(j));
originalList.remove(j);
modifiedList.remove(j);
}
}System.out.println();
}
当我运行循环时,我得到以下内容:
pans naps snap
pots
sit it's
tis
一切都是正确的,除非tis没有被列为坐下来的字谜。这是导致使用modifiedList.remove(j)
导致第二个循环在到达tis之前退出的原因,并且tis永远不会被打印出来。 modifiedList.remove(j)是必要的,以便在输出中不重复单词。我如何解决这个问题,以便将tis列为坐下的字谜,这是什么?
答案 0 :(得分:1)
问题是您正在更改阵列上的索引,但不会更改j。当你删除时,你将每个后续项目的索引减少1.因此,当你点击它时,它会匹配。你移除它,移动它曾经拥有的索引。然后,将j添加1,现在从数组的末尾开始运行(因为已经删除了snap)。因此,在删除j后,您需要将j递减1。
答案 1 :(得分:0)
反转你的循环 - 从数组的后面到前面。这样,当您删除条目时,您不会更改尚未阅读的条目的索引。
您的另一个选择是通过调整循环索引来考虑删除,但这更棘手。
(另一种选择是组成一个包含原始字符串和已排序字符串的对象。创建一个这样的数组,并使用排序方案对其进行排序,该排序方案将对排序后的字符串进行排序。然后扫描列表并注意当你有相同排序键的“运行”时。不需要删除。
创建该对象的“骗子”方法是将排序的和原始的字符串放在一个字符串中,用空格或其他特殊字符分隔,然后对字符串进行排序。)