实现Comparable接口会产生"UnsupportedOperationException:ListIterator不支持set"错误

Hir*_*oki 2 java

我想要做的是用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类.

如果您愿意提供任何见解,我将不胜感激.

fge*_*fge 7

@Takendarkk在这里正确的轨道......

来自javadocSetUniqueList:

List接口做出某些假设/要求.这种实现以某种方式打破了这些,但这仅仅是拒绝重复的结果.每种违规都在方法中解释,但不应影响您.

那么,在你的情况下,它确实(影响你)......

Collections.sort()期待一个List论点 ; 和a List应该能够产生一个ListIterator.并Collections.sort()依赖于...除了SetUniqueList返回ListListIterator实现不支持.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)