2016-09-09 6 views
2

Я пытаюсь сортировать свой список, но этот не работает. Метод collections.sort() ничего не делает.Collections.sort() не работает для настраиваемых объектов

public boolean schedule(){ 
    List<Task> keys = new ArrayList<Task>(g.tasks.keySet()); 
    for(int i = 0; i<keys.size();i++){ 
     System.out.println(keys.get(i).getSize()); 
    } 
    Collections.sort(keys); 
    for(int i = 0; i<keys.size();i++){ 
     System.out.println(keys.get(i).getSize()); 
    } 
    return true; 
} 

и это мой метод CompareTo() в классе задач:

public int compareTo(Task t1) { 
    Integer csize = new Integer(t1.size); 
    int cmp = csize.compareTo(t1.size); 

    return cmp; 
} 

Что плохого в этом методе?

ответ

5

Collections.sort не работает для пользовательских объектов

Конечно, это делает, но это не будет в вашем случае, потому что ваш метод CompareTo нарушается. Вы сравнивая размер t1 к себе, а не к размеру this

Вы получили:

public int compareTo(Task t1) { 
    Integer csize = new Integer(t1.size); // get t1's size 
    int cmp = csize.compareTo(t1.size); // ???? compare with t1's size ??? 

    return cmp; 
} 

Вы должны изменить его на что-то вроде:

public int compareTo(Task t1) { 
    return Integer.compare(this.size, t1.size); 
} 

Итак, теперь вы сравнивая размер параметра с размером текущего объекта.

+0

Большое спасибо, еще один крошечный вопрос. Как я могу сортировать его от самого низкого до самого высокого, потому что теперь противоположное. – soommy12

+1

@Buszman: О, это тривиально - и я готов поспорить, если вы догадались, вы можете понять это за секунды - так, как вы думаете? –

+0

@Buszman: Подсказка - вам нужно лишь немного изменить мою строку кода. –

3

У вас есть ошибка в compareTo, которая указана в принятом ответе. Я поставляя дополнительный ответ только, чтобы обеспечить различные идиомы вы могли бы рассмотреть для определения естественного порядка класса:

class Task implements Comparable<Task> { 
    private static final Comparator<Task> ORDER = Comparator 
     .comparingInt(Task::getSize) 
     .reversed() 
     .thenComparing(Task::getPriority); 

    public int compareTo(Task other) { 
     return ORDER.compare(this, other); 
    } 
} 

Потенциальное преимущество этой делегации идиомы в том, что на случайном чтении традиционного compareTo реализации легко пропустите такие вещи, как порядок аргументов, изменяющих сравнение. Декларация делает это очень явным. Это также означает, что у вас есть все возможности Comparator (например, решение о том, что нули являются первыми или последними).

+0

Хороший ответ 1+! –

0

Уже был отправлен @HoverCraft. В дополнение к этому

//For ASC 
public int compareTo(Task t1) { 
    return (this.size - t1.size); 
} 
//For DESC 
public int compareTo(Task t1) { 
    return (t1.size - this.size); 
} 
Смежные вопросы