Java SetUniqueList、HashSet和Set don';t从对象列表中删除重复项

Java SetUniqueList、HashSet和Set don';t从对象列表中删除重复项,java,Java,我一直在尝试对列表中的对象进行排序,并从同一列表中删除重复的对象 这是对象的类 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

我一直在尝试对列表中的对象进行排序,并从同一列表中删除重复的对象

这是对象的类

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;

    }
}
  • 设置

    Set<Word> noDupSet = new LinkedHashSet<Word>(WordsListWithNumber);
       List<Word> noDup = new ArrayList<>();
       noDup.addAll(noDupSet);
    
    如果您能提供任何见解,我将不胜感激

    p.S.

    我意识到“数字”属性应该被命名为“数量”。。。似乎有些人认为这个“number”属性类似于ID号,但它实际上表示“WordsList”包含多少相同的单词

    我想比较“wordname”,而不是“number”。
    对不起,我不是英语母语者。

    如果您想删除<代码>列表< />代码中的重复,您需要指定何时考虑两个项目是重复的。指定这一点很重要,因为在您的情况下,对于重复的

    word1
    word2
    的含义,至少有4种可能的解释:

  • word1==word2
  • word1.number==word2.number
  • word1.wordName.equals(word2.wordName)
  • 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
    。(请搜索以了解对此的解释)

    下面是一个可能的
    hashCode
    方法,用于
    Word

    @Override
    public int hashCode() {
        return wordName.hashCode(); 
    }
    
    如果您这样做,您会发现如果
    列表
    是一个
    列表
    ,您可以通过写入来删除重复项

    list = new ArrayList<Word>(new LinkedHashSet<Word>(list));
    
    list=newarraylist(newlinkedhashset(list));
    
    有关如何编写
    equals
    hashCode
    compareTo
    方法的详细信息(如果数字很大,您的
    compareTo
    方法可能会失败),我推荐Joshua Bloch的《有效Java》一书


    祝你好运

    等待;如何确定“重复项”?这是基于
    compariable
    .equals()
    /
    .hashCode()
    的结果吗?为什么你的
    compariable
    只检查
    数字
    ?问题是我们不知道
    wordName
    数字
    之间是否有任何联系。基于减法的比较器无论如何都不符合
    compareTo
    的约定,因为减法可能溢出。>fge,只要删除重复项,任何选项都可以。我使用“Comparable”按“number”属性对“WordsListWithNumber”列表进行排序。(也就是说,我想对列表进行排序,使第一个单词具有最大的“number”属性)老实说,我还不熟悉.equals()/.hashCode()。我使用SetUniqueList、HashSet和Set,只是因为它们经常显示在Stackoverflow上。>Elliott,我使用Comparable对“WordsListWithNumber”列表进行排序,因为我希望列表中的第一个“Word”具有最大的“number”属性。我没有用它来删除重复项。。。可以用Compariable删除重复项吗?非常感谢。。。现在它可以按我的要求工作了!我也会查这本书的。我很高兴能帮上忙:)。你必须得到那本书。我从那本书中学到了关于Java的所有知识。
        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());
    
    @Override
    public boolean equals(Object object) {
        return object instanceof Word && ((Word) object).wordName.equals(wordName);
    }
    
    @Override
    public int hashCode() {
        return wordName.hashCode(); 
    }
    
    list = new ArrayList<Word>(new LinkedHashSet<Word>(list));