gpt4 book ai didi

java - SetUniqueList、HashSet 和 Set 不会从对象列表中删除重复项

转载 作者:行者123 更新时间:2023-11-30 08:58:14 24 4
gpt4 key购买 nike

我一直在尝试做的是对 List 中的对象进行排序,并从同一个 List 中删除重复的对象。

这是对象的类

public class Word implements Comparable<Word>{

private String wordName;
private int number;

// There are only simple constructers, getters and setters

// This compareTo might be irrelevant for this question
@Override
public int compareTo(Word word) {
int compareNumber = ((Word) word).getNumber();
return compareNumber - this.number;

}
}

这是main方法的一部分

public class CommentEvaluationTester {
final static private List<String> WordsList = new ArrayList<>();

public static void main(String[] args) {

boolean isContained;
String comment = "";
//This "comment" actually has a long string value
for (String word : WordsInDB) {
//WordsInDB is a List, containing String values

isContained = comment.toLowerCase().contains(word.toLowerCase());
if (isContained) {
WordsList.add(word);
}
}

List WordsListWithNumber = new ArrayList<>();

for (String word : WordsList) {
int occurrences = Collections.frequency(WordsList, word);

Word addWord = new Word(word, occurrences);
WordsListWithNumber.add(addWord);

}

//This might be irrelevant too
Collections.sort(WordsListWithNumber, new Comparator<Word>() {
@Override
public int compare(Word w1, Word w2) {
return w2.getNumber() - w1.getNumber();
}
});

在这个阶段,“WordsListWithNumber”列表包含多个“Word”实例,我一直试图从这个列表中删除重复项。

我在 Stackoverflow 上找到了几种方法。

  1. 设置唯一列表

    List<Word> NoDup = SetUniqueList.setUniqueList(WordsListWithNumber);
  2. 哈希集

    HashSet hs = new HashSet();
    hs.addAll(WordsListWithNumber);
    WordsListWithNumber.clear();
    WordsListWithNumber.addAll(hs);
  3. 设置

    Set<Word> noDupSet = new LinkedHashSet<Word>(WordsListWithNumber);
    List<Word> noDup = new ArrayList<>();
    noDup.addAll(noDupSet);

我已经确认所有这些方法都可以从“字符串”列表中删除重复项,但它似乎没有从此类列表中删除重复项。

我通过这样做检查了列表的内容...但是它们都显示相同的值。

    Word testWord = (Word) noDup.get(0);
System.out.println("test1: noDup.get(0) : " + testWord.getWordName() + " , number : " + testWord.getNumber());
testWord = (Word) noDup.get(1);
System.out.println("test2: noDup.get(1) : " + testWord.getWordName() + " , number : " + testWord.getNumber());

如果您能提供任何见解,我将不胜感激。

附言

我意识到“number”属性应该被命名为“quantity”……似乎有些人认为这个“number”属性类似于身份证号码,但它实际上表示“WordsList”中有多少相同的单词"包含。

我想比较“wordname”,而不是“number”。抱歉造成混淆,我的母语不是英语。

最佳答案

如果您想从 List 中删除重复项,您需要指定何时将两个项目视为重复项。指定很重要,因为在您的情况下,对于 word1 的含义至少有 4 种可能的解释。和 word2重复:

  1. word1 == word2 .
  2. word1.number == word2.number
  3. word1.wordName.equals(word2.wordName)
  4. word1.number == word2.number && word1.wordName.equals(word2.wordName)

你已经表明你的意思是 3。

指定重复的方式是覆盖 equals方法。您可以按如下方式进行。

@Override
public boolean equals(Object object) {
return object instanceof Word && ((Word) object).wordName.equals(wordName);
}

每当您覆盖 equals您还必须重写方法 hashCode . (搜索 SO 以获得对此的解释)。

这是一个可能的 hashCode Word 的方法.

@Override
public int hashCode() {
return wordName.hashCode();
}

如果你这样做你会发现如果listList<Word> ,您可以通过编写删除重复项

list = new ArrayList<Word>(new LinkedHashSet<Word>(list));

有关如何编写 equals 的完整详细信息, hashCodecompareTo方法(如果数字很大,你的 compareTo 方法可能会失败),我推荐 Joshua Bloch 的 Effective Java 一书。

祝你好运!

关于java - SetUniqueList、HashSet 和 Set 不会从对象列表中删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27751185/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com