0

所以我有一个如下所示的ArrayList调用originalList

[平底锅,小睡,锅,坐,这是,蒂斯,啪]

我也有一个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 没有被列为 sat 和 it's 的字谜。这是 using modifiedList.remove(j)which 导致第二个循环在到达 tis 之前退出的原因,并且 tis 永远不会用 sat 和 it's 打印。modifiedList.remove(j) 是必需的,这样单词就不会在输出中重复。我将如何解决这个问题,以便将 tis 列为 sat and it's 的字谜?

4

2 回答 2

1

问题是您正在更改数组的索引,但没有更改 j。当您删除时,您会将以下每个项目的索引减少 1。因此,当您点击它时,它会匹配。您删除它,将 tis 移动到它曾经拥有的索引。然后,将 1 添加到 j,它现在超出了数组的末尾(因为 snap 已经被删除了)。因此,在删除 j 之后,您需要将 j 减 1。

于 2013-03-10T02:18:47.543 回答
0

反转你的循环——从数组的后面工作到前面。这样,当您删除条目时,您不会更改尚未阅读的条目的索引。

您的另一个选择是通过调整循环索引来考虑删除,但这更棘手。

(还有一个选择是组成一个包含原始字符串和排序字符串的对象。制作一个数组,并使用排序方案对其进行排序,该排序方案将对排序后的字符串进行排序。然后扫描列表并注意何时你有一个“运行”的相同排序键。不需要删除。

创建该对象的“骗子”方法是将排序的字符串和原始字符串放在一个字符串中,用空格或其他特殊字符分隔,然后对字符串进行排序。)

于 2013-03-10T02:19:18.527 回答