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)
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));