Java ArrayList删除没有集合的重复项

标签 java arraylist

<分区>

我在从 ArrayList 中删除重复项时遇到问题。这是为了大学的作业。这是我已有的代码:

public int numberOfDiffWords() {
    ArrayList<String> list = new ArrayList<>();
    for(int i=0; i<words.size()-1; i++) {
        for(int j=i+1; j<words.size(); j++) {
            if(words.get(i).equals(words.get(j))) {
                // do nothing
            }
            else  {
                list.add(words.get(i));
            }
        }
    }
    return list.size();
}

问题出在 numberOfDiffWords() 方法中。填充列表方法工作正常,因为我的导师给了我一个示例字符串(包含 4465 个单词)来分析 - 打印 words.size() 给出了正确的结果。

我想返回删除了所有重复项的新 ArrayList 的大小。

words 是一个 ArrayList 类属性。

更新:我应该提到我只允许在分配的这一部分使用基于动态索引的存储,这意味着不能使用基于哈希的存储。

最佳答案

因为这是一项作业,所以我不打算编写代码。不过,我建议采用不同的方法。

  • 像你一样遍历数组
  • 使用 subList() 方法构造一个从开始到但不包括当前元素的数组 View
  • 使用contains()测试当前元素是否在上一步构造的子列表中
  • 只计算找到多少个不包含在前缀中的元素

我推荐的方法应该会产生更简单、更容易理解的代码。请注意,所有这些都是一个 O(n2) 的解决方案(如果您做对了,这也是您的解决方案)。

如果赋值允许修改数组,另一种方法是对数组进行排序。那么相等的元素将是相邻的,很容易计算出有多少是唯一的。这是一种 O(n log(n)) 方法。 (您也可以只复制数组,这不会改变渐近复杂度,但会减慢求解速度。)

如果不使用某种散列函数(HashSetHashMap),您将不会比这更好。

关于Java ArrayList删除没有集合的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13671390/

相关文章:

java - eclipse 3.4 (ganymede) 包与类型的冲突

java - 如何在 Swing 中绘制该图?

java - 在对象列表 (ArrayList) 中添加对象!

java - 在 for 循环中添加到 HashSet 时,如何删除重复项并用另一个对象替换它们?

Java:ArrayList、字符串操作和解析

java - 规避 BufferedImage 的数组大小 > Integer.MAX_VALUE?

java - JDBC 断管 Mac

java - 无法使用响应式(Reactive)方法将文档保存到 Couchbase

java - 正确地将一堆项目添加到 ArrayList

java - 在 txt 文件上写入文本及其方法