- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在尝试做的是对 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 上找到了几种方法。
设置唯一列表
List<Word> NoDup = SetUniqueList.setUniqueList(WordsListWithNumber);
哈希集
HashSet hs = new HashSet();
hs.addAll(WordsListWithNumber);
WordsListWithNumber.clear();
WordsListWithNumber.addAll(hs);
设置
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
重复:
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
. (搜索 SO 以获得对此的解释)。
这是一个可能的 hashCode
Word
的方法.
@Override
public int hashCode() {
return wordName.hashCode();
}
如果你这样做你会发现如果list
是 List<Word>
,您可以通过编写删除重复项
list = new ArrayList<Word>(new LinkedHashSet<Word>(list));
有关如何编写 equals
的完整详细信息, hashCode
和 compareTo
方法(如果数字很大,你的 compareTo
方法可能会失败),我推荐 Joshua Bloch 的 Effective Java 一书。
祝你好运!
关于java - SetUniqueList、HashSet 和 Set 不会从对象列表中删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27751185/
我一直在尝试做的是对 List 中的对象进行排序,并从同一个 List 中删除重复的对象。 这是对象的类 public class Word implements Comparable{ privat
我是一名优秀的程序员,十分优秀!