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)
where
i==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]
Put
i--代替
j--