2015-01-01 2 views
0

То, что я пытаюсь сделать, - это отсортировать объект массива с помощью свойства (Integer) в Java.Реализация интерфейса Comparable создает ошибку «UnsupportedOperationException: ListIterator не поддерживает set»

Я нашел несколько сообщений об использовании Comparable/Comparator для этой команды, но ни одна из них, похоже, не связана с ошибкой «java.lang.UnsupportedOperationException». Итак, я пишу вопрос здесь.

Я следовал за this page и пытался использовать интерфейс 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; 

    } 
} 

Основной метод, как это.

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

} 

Тогда это производит "java.lang.UnsupportedOperationException: ListIterator не поддерживает набор".

Я смущен, в частности, о «ListIterator», так как я не использую этот класс и не использую класс Set.

Буду признателен, если вы дадите представление.

+2

Не 'SetUniqueList.setUniqueList()' использовать набор внутри? – csmckelvey

+0

@Takendarkk мой ответ должен был быть вашим, действительно; хорошее пятно! – fge

+0

@fge Я просто взглянул на документы, вы на самом деле сделали исследование и объяснили это. Снимаю перед вами шляпу. – csmckelvey

ответ

4

@Takendarkk на правильный путь здесь ...

От javadoc of SetUniqueList:

Интерфейс Список делает определенные допущения/требования. Эта реализация нарушает их определенным образом, но это всего лишь результат отказа от дубликатов. Каждое нарушение объясняется в методе, но оно не должно влиять на вас.

Ну, в вашем случае, это (влияет на вас) ...

Collections.sort() expects a List as an argument; и предполагается, что 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); 
} 

Другой "лучше" версия:

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

Или с Java 8:

public static <T> List<T> onlyUniqueItemsFrom(final List<T> originalList) 
{ 
    return originalList.stream().distinct().collect(Collectors.toList()); 
} 

Мех с Java 8 Вы могут выполнять обе операции одним способом:

return originalList.stream().distinct().sorted(yourComparatorHere) 
     .collect(Collectors.toList()); 
+0

'SetUniqueList' находится в коллекциях Commons Apache. Это реализация «List», которая не позволяет дублировать. –

+1

Ну, похоже, что он сломан несколько, не так ли? Это только я, но я никогда не доверял Apache для всего серьезного ... – fge

+0

Я тоже этого не использую, но в этом случае они безупречны. если 'List' не допускает дубликатов, он никогда не будет совместим с какой-либо разумной реализацией' sort' (как предполагается, что обмен будет проходить без промежуточной стадии с дубликатом?). –