Java 为什么循环制动比应该的更早?
所以我有一个Java 为什么循环制动比应该的更早?,java,for-loop,anagram,Java,For Loop,Anagram,所以我有一个for循环,看起来像这样: for (int i = 0; i < al.size(); i++) { for (int j = i + 1; j < al.size(); j++) { if (isAnagram(al.get(i), al.get(j))) { al.set(i, al.get(i) + " " + al.get(j)); al.remove(j); } }
for
循环,看起来像这样:
for (int i = 0; i < al.size(); i++) {
for (int j = i + 1; j < al.size(); j++) {
if (isAnagram(al.get(i), al.get(j))) {
al.set(i, al.get(i) + " " + al.get(j));
al.remove(j);
}
}
}
[aabb, aabc, abab, abba, abcd, bbaa, cbad]
和isAnagram
返回true
或false
,前提是两个给定字符串是否为字谜。
我试图让它将每个单词的所有字谜添加到一个字符串中,使其看起来像这样:
[aabb abab abba bbaa, aabc, abcd cbad]
现在我得到了:
[aabb abab, aabc, abba bbaa, abcd cbad]
因此,我认为正在发生的事情是,的第二个在找到al.get(i)
的第一个字谜时结束,然后它中断并转到下一个i
。有人能解释一下为什么会发生这种情况吗?您的列表:
[aabb, aabc, abab, abba, abcd, bbaa, cbad]
当j=2
时,您将看到abab
。您发现这是一个字谜,所以您修改了前面的元素并删除了abab
。下面是您现在的列表:
[aabb abab, aabc, abba, abcd, bbaa, cbad]
现在有两个问题。首先,“abba”
过去是al.get(3)
,但现在是al.get(2)
。但是当你回环时,你增加了j
,所以j
现在是3。结果是,您的代码从不查看“abba”
另一个问题是,即使您的代码确实查看了“abba”
,也不会发现它是一个字谜。这是因为您已销毁了与之比较的字符串,即al.get(i)
wherei==0
。这个字符串是“aabb”
,但现在是“aabb abab”
。因此,你的逻辑将不再有效
您需要做两件事:
(1) 重新安排循环,以便在删除元素时不会增加j
;只有在不删除它的情况下,才能增加j
。就我个人而言,我会使用while
循环而不是for
循环来实现这一点。[值得一提的是,我不喜欢修改For
循环中使用的索引变量的做法;我认为这会降低代码的可读性,因为对我来说,通常的For
循环使用j++
,因为第三部分看起来像是要对序列中的每个整数执行主体,然后修改j(2) 不要修改al.get(i)
(也就是说,不要调用al.set(i,新值)
),直到您在字谜检查中不再需要它,即当内部循环完成时。您必须声明一个变量来保存新字符串,然后稍后调用al.set
。在数组列表al.remove(j)中不能删除这样的项代码>应该使用迭代器删除ul.remove(j)代码>在删除它后没有帮助,我得到:[aabb abab,aabc,abab abba,abba bbaa,abcd cbad,bbaa,cbad]
-对于一个字符串,它仍然不能超过一个字谜一个解决方案是插入j-代码>移除'al.移除(j)后的内部if条件`添加j--代码>也没有帮助。输出仍然是:[aabb abab,aabc,abba bbaa,abcd cbad]
Puti--代码>代替j--代码>