我想要做的是用Java中的属性(Integer)对对象的arraylist进行排序.
我发现了几篇关于使用Comparable/Comparator进行此操作的帖子,但它们似乎都与"java.lang.UnsupportedOperationException"错误无关.所以,我在这里写一个问题.
我按照这个页面,一直在尝试使用Comparable接口.
这是我编码的一部分
public class Word implements Comparable<Word>{
private String wordName;
private int number;
// There are only simple constructers, getters and setters
@Override
public int compareTo(Word word) {
int compareNumber = ((Word) word).getNumber();
return compareNumber - this.number;
}
}
Run Code Online (Sandbox Code Playgroud)
主要方法是这样的.
public static void main(String[] args) {
//There are some irrelevant methods and fields
List newWordList = new ArrayList<>();
for (String wordName : WordList) {
//WordList is of List<String>, containing several "wordName" (i.e. string values)
//Get how many duplicate "wordName" inside the list
int number = Collections.frequency(WordList, wordName);
Word word = new Word(wordName, number);
newWordList.add(word);
}
List noDupList = SetUniqueList.setUniqueList(newWordList);
Collections.sort(noDupList, new Comparator<Word>() {
@Override public int compare(Word w1, Word w2) {
return w2.getNumber() - w1.getNumber();
}
});
}
Run Code Online (Sandbox Code Playgroud)
然后,这会产生"java.lang.UnsupportedOperationException:ListIterator不支持set".
我特别关注"ListIterator",因为我不使用这个类,也不使用Set类.
如果您愿意提供任何见解,我将不胜感激.
@Takendarkk在这里正确的轨道......
List接口做出某些假设/要求.这种实现以某种方式打破了这些,但这仅仅是拒绝重复的结果.每种违规都在方法中解释,但不应影响您.
那么,在你的情况下,它确实(影响你)......
Collections.sort()期待一个List论点 ; 和a List应该能够产生一个ListIterator.并Collections.sort()依赖于...除了SetUniqueList返回List其ListIterator实现不支持.set()操作.
因此,您不能SetUniqueList用于您的用例.你必须编写自己的方法来生成一个List没有重复的方法.
三个例子; 首先,"天真"的:
public static <T> List<T> onlyUniqueItemsFrom(final List<T> originalList)
{
final Set<T> set = new HashSet<>(originalList);
return new ArrayList<>(set);
}
Run Code Online (Sandbox Code Playgroud)
另一个"更好"的版本:
public static <T> List<T> onlyUniqueItemsFrom(final List<T> originalList)
{
final Set<T> set = new HashSet<>(originalList.size());
final List<T> ret = new ArrayList<>(originalList.size());
for (final T element: originalList)
if (set.add(element))
ret.add(element);
return ret;
}
Run Code Online (Sandbox Code Playgroud)
或者,使用Java 8:
public static <T> List<T> onlyUniqueItemsFrom(final List<T> originalList)
{
return originalList.stream().distinct().collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)
嗯,使用Java 8,您可以在一个方法中完成两个操作:
return originalList.stream().distinct().sorted(yourComparatorHere)
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1149 次 |
| 最近记录: |