为什么这个 while 循环不中断?

Why doesn't this while-loop break?

提问人:jvkloc 提问时间:9/15/2019 最后编辑:denvercoder9jvkloc 更新时间:9/15/2019 访问量:97

问:

这是一个用 Java 编写的 while 循环。目的是从列表中删除所有重复项。但这个循环并没有被打破。可能还有其他错误。

public static <E extends Comparable<? super E>> void removeDuplicates(ArrayList<E> L) {
    ArrayList<E> temp = new ArrayList<E>(L.size());
    ArrayList<Integer> index = new ArrayList<>(L.size());
    int stop = 0;

    while (true) {
        //test for duplicates and save their indexes
        for (int i = 0; i < L.size(); i++) {
            if (!temp.contains(L.get(i))) {
                temp.add(L.get(i));
                index.add(i);
            }
        }
        // if there were duplicates they will be removed
        if (!index.isEmpty()) {
            stop = 1;
            for (int j = 0; j < index.size(); j++) {
                L.remove(index.get(j));
            }
        }
        //if nothing is removed there should be no duplicates and the loop should break
        if (stop == 0) {
            break;
        }
        index.clear();
        temp.clear();
        stop = 0;
    }

} 
java 数组 while-loop break

评论

1赞 Gerold Broser 9/15/2019
为什么不使用 Java 中将 List 转换为 Set 的最简单方法,当 Set 在设计上不包含重复元素时?

答:

2赞 Gaurav Jeswani 9/15/2019 #1

当临时列表中已存在要删除的项目列表时,您需要更新这些项目列表。因此,索引列表将包含所有重复元素的索引:

public static <E extends Comparable<? super E>> void removeDuplicates(final ArrayList<E> L) {
final ArrayList<E> temp = new ArrayList<E>(L.size());
final ArrayList<Integer> index = new ArrayList<>(L.size());
int stop = 0;

while (true) {
  //test for duplicates and save their indexes
  for (int i = 0; i < L.size(); i++) {
    if (!temp.contains(L.get(i))) {
      temp.add(L.get(i));
    } else {

      index.add(i);
    }
  }
  // if there were duplicates they will be removed
  if (!index.isEmpty()) {
    stop = 1;
    for (int j = index.size() - 1; j >= 0; j--) {
      L.remove((int) index.get(j));
    }
  }
  //if nothing is removed there should be no duplicates and the loop should break
  if (stop == 0) {
    break;
  }
  index.clear();
  temp.clear();
  stop = 0;
}

评论

0赞 jvkloc 9/15/2019
谢谢。我以为 while 最后一行的 stop = 0 会这样做。现在我在没有它的情况下进行了测试,它实际上并没有改变任何东西。仍然有错误;该代码不会删除所有重复项。它只删除一个,并将其余的重复项保留到列表中。
0赞 Gaurav Jeswani 9/15/2019
请参考此更新的代码,您需要在 else 条件下更新索引列表。以及当您使用 index 删除元素时,将其转换为 int,其他带有 Object 输入参数的重载方法将被调用。
0赞 jvkloc 9/15/2019
现在它开始工作了!谢谢!...如何在评论中使用@符号?我把它放在评论的开头和“Gaurav Jeswani”,但我在那里没有看到你的用户名。
0赞 Gaurav Jeswani 9/15/2019
:D连我自己都不知道。我想你可以接受答案。;)
0赞 jvkloc 9/15/2019
啊哈,还有接受答案的标志。再次感谢你,非常感谢你帮助像我这样的初学者:)