当前位置: 首页 > 知识库问答 >
问题:

防止重复对象被添加到ArrayList或HashSet中

康弘义
2023-03-14

所以我的目标是把一个字符串拆分成一个Word对象数组。我只想要一个对象来表示一个英语单词,这意味着在添加到数组之前应该过滤掉重复的单词。我一辈子都不知道为什么我过滤掉重复单词的标准失败了。我已经尝试了ArrayList和HashSet。我的目标是在字符串中计算该单词的实例,但我还没有实现。

package sandbox;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;

public class Sandbox {

public static void main(String[] args) {

    String original = "the quick brown fox jumps over the lazy dog the quick brown fox jumps over the lazy dog";
    int wordCount = counter(original);//Count the words using a method
    Word[] word = new Word[wordCount];
    List<Word> wordList = new ArrayList<>();
    HashSet wordSet = new HashSet();

    for (int i = 0; i < wordCount; i++) {
        String[] parts = original.split(" ");//Splits the String.
        word[i] = new Word();//Instantiates a Word object.
        word[i].setWord(parts[i], 1);//Sets Word object values.

        if (wordSet.contains(word[i])) {//Criteria for adding the Word object to the HashSet.
            System.out.println("Duplicate detected.");
        } else {
            wordSet.add(word[i]);//Adds the Word object to a HashSet.
        }

        if (wordList.contains(word[i])) {//Criteria for adding the Word object to the ArrayList.
            System.out.println("Duplicate detected.");
        } else {
            wordList.add(word[i]);//Adds the Word object to the ArrayList.
        }

    }

    System.out.println("wordSet size: " + wordSet.size() + " | wordList size: " + wordList.size());
    for (int i = 0; i < wordCount; i++) {

        System.out.println(wordList.get(i));

    }
    System.out.println(wordSet.toString());
}

public static int counter(String s) {

    int wordCount = 0;

    boolean word = false;
    int endOfLine = s.length() - 1;

    for (int i = 0; i < s.length(); i++) {
        // if the char is a letter, word = true.
        if (Character.isLetter(s.charAt(i)) && i != endOfLine) {
            word = true;
            // if char isn't a letter and there have been letters before,
            // counter goes up.
        } else if (!Character.isLetter(s.charAt(i)) && word) {
            wordCount++;
            word = false;
            // last word of String; if it doesn't end with a non letter, it
            // wouldn't count without this.
        } else if (Character.isLetter(s.charAt(i)) && i == endOfLine) {
            wordCount++;
        }
    }
    return wordCount;
}

}

我的单词分类是:

package sandbox;

public class Word {

private String word = "";
private int count;

public Word() {

    word = "";
    count = 0;

}

public void setWord(String w, int c) {
    word = w;
    count = c;

}

public void getWord() {
    System.out.println(word + ", " + count);
}

public boolean duplicate(Word word2) {

    return this.word.equals(word2.word);

}

@Override
public String toString() {
    return ("word: " + this.word + " | count: " + count);
}

public boolean equals(Word word2) {
    return this.word.equals(word2.word);
}
}

这是我当前的输出:

单词集大小:18 |单词列表大小:18

word: the | count: 1

字:快速|计数: 1

单词:棕色|计数:1

单词:狐狸|计数:1

单词:跳跃|计数:1

字:超过|计数:1

word: the | count: 1

单词:懒|计数:1

单词:狗|计数:1

word: the | count: 1

字:快速|计数: 1

单词:棕色|计数:1

单词:狐狸|计数:1

单词:跳跃|计数:1

字:超过|计数:1

word: the | count: 1

单词:懒|计数:1

单词:狗|计数:1

共有1个答案

周承天
2023-03-14

您不会覆盖对象的等号。你正在超载它。要覆盖它,参数类型应为 对象

它应该是:

@Override
public boolean equals(Object other) {
    if (!(other instanceof Word)) return false;
    Word word2 = (Word) other;
    return this.word.equals(word2.word);
}

要使HashSet正常运行,您还必须覆盖hashCode

 类似资料:
  • 问题内容: 我有一个特定的类C的arraylist。 C类具有两个属性,即。 现在,当我将C类型的对象添加到ArrayList myList时,我想检查列表中是否已经存在对象,且其str1和str2的值与该对象的参数值(str1和str2)相匹配我要补充。 有什么有效的方法可以执行此操作,而不必每次都遍历完整列表并检查参数之间是否匹配? 问题答案: 您需要重写C类中的方法。 例如 然后,可以调用m

  • 我的任务是实现一个蛮力算法来输出一些n的整数[1,2,…, n]的所有排列。但是,我似乎在将ArrayList对象添加到HashSet时遇到了一些问题: 我发现对“nextPer的连续调用确实找到了所有排列,但是我不明白当我将排列添加到HashSet“allPer的排列”时会发生什么。我在n=3的情况下运行时得到的输出是这样的: [[3, 2, 1, 1, 2, 1, 1, 3, 1, 2], [

  • 我刚学过JAVA,我对这段代码有一个问题: 现在我的包含!在这种情况下,我如何简单地避免重复?我以为HashSet不允许重复。

  • 问题内容: 说我像这样创建一些对象类 现在,我想创建一个arraylist来容纳许多这样的对象类。 我想包含某种逻辑,以便在这种情况下…当我们尝试添加对象“ second”而不是向arrayList添加新对象时,我们将second.getNum()添加到first.getNum()。因此,如果要遍历ArrayList,它将是 我在想出一种优雅的方式来解决这个问题时遇到了麻烦。随着arraylist

  • 我试图向ArrayList对象添加构造函数有3个参数(int,int,hashset)的对象。当我添加一个新对象时,哈希集中的值会发生某种变化,所以我添加了错误的值。例如,我创建3个对象,添加这3组整数: 但object会收到这些: 我不明白为什么集合会改变其值。这是函数代码: 在这段代码中我: > 获取对象的ArrayListallIndexedItems,描述文本中的单词(文本在mysql表中

  • 问题内容: 我想向中添加一个对象,但是每次我向具有3个属性的新对象添加时,都会出现错误。 在这里,我正在尝试创建其对象并将其传递给的类。 问题答案: 创建对象时需要使用运算符 要不然 并且您的构造函数不应包含。否则它将成为您班上的一个方法。