【发布时间】:2015-01-03 02:34:23
【问题描述】:
我一直在尝试做的是对 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());
如果您能提供任何见解,我将不胜感激。
附言
我意识到“数字”属性应该被命名为“数量”......似乎有些人认为这个“数字”属性类似于ID号,但它实际上表示“WordsList”中有多少个相同的单词" 包含。
我想比较“字名”,而不是“数字”。 抱歉,我的母语不是英语。
【问题讨论】:
-
等待;你如何确定“重复”?这是
Comparable或.equals()/.hashCode()的结果吗? -
为什么你的
Comparable只检查number? -
问题是我们不知道
wordName和number之间是否应该有任何联系。无论如何,基于减法的比较器不符合compareTo的约定,因为减法可能会溢出。 -
>fge,只要删除重复项,任何选项都可以。我使用“Comparable”来按“number”属性对“WordsListWithNumber”列表进行排序。 (即我想对列表进行排序,以便第一个单词具有最大的“数字”属性)老实说,我还不熟悉 .equals()/.hashCode() 。我使用了 SetUniqueList、HashSet 和 Set,只是因为它们经常出现在 Stackoverflow 上。
-
>Elliott,我使用 Comparable 来对“WordsListWithNumber”列表进行排序,因为我希望列表中的第一个“单词”具有最大的“数字”属性。我没有用它来删除重复项... Comparable 可以用来删除重复项吗?
标签: java