Сортировка ArrayList, заполненная объектами по их идентификатору, с использованием Collections.sort(arrayListName)

У меня есть класс инвентаря, который создает ArrayList, полный объектов Item, который также является классом. Я знаю, что мне нужно вызвать Collections.sort(items);, чтобы отсортировать ArrayList (кстати, он называется элементами). В задании говорится, что я должен использовать интерфейс в классе Item, я не знаю, реализовывать ли Comparator или Comparable, а затем что писать для метода compareTo() или метода compare() соответственно. Также у меня есть вызов Collections.sort(items) сразу после того, как я объявлю свой ArrayList, это нормально?

Изменить: мой учитель только что пояснил, что хочет, чтобы мы реализовали Comparable<Item> в классе Item.


person bassandguitar    schedule 21.04.2013    source источник


Ответы (3)


вам нужно реализовать Comparable и он будет работать Collections.sort

Если вам нужен новый компаратор и вы не хотите использовать Comparable, вы можете создать новый Comparator и использовать его как: Collections.sort(list, new MyComparator())

public class Fruit implements Comparable<Fruit>{
    
    private String fruitName;
    private String fruitDesc;
    private int quantity;
    
    public Fruit(String fruitName, String fruitDesc, int quantity) {
        super();
        this.fruitName = fruitName;
        this.fruitDesc = fruitDesc;
        this.quantity = quantity;
    }
    
    public String getFruitName() {
        return fruitName;
    }
    public void setFruitName(String fruitName) {
        this.fruitName = fruitName;
    }
    public String getFruitDesc() {
        return fruitDesc;
    }
    public void setFruitDesc(String fruitDesc) {
        this.fruitDesc = fruitDesc;
    }
    public int getQuantity() {
        return quantity;
    }
    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

    public int compareTo(Fruit compareFruit) {
    
        int compareQuantity = ((Fruit) compareFruit).getQuantity(); 
        
        //ascending order
        return this.quantity - compareQuantity;
        
        //descending order
        //return compareQuantity - this.quantity;
        
    }   
}

источник: mkyong

person Alex    schedule 21.04.2013
comment
Итак, у меня есть Item, реализующий Comparable‹Item›, а затем в классе я определил compareTo() как public int compareTo (Item other) { if (this.id.compareToIgnoreCase((other.getId())) == 0) вернуть 0; иначе если (this.id.compareToIgnoreCase(other.getId()) › 0) вернуть 1; иначе вернуть -1; } Теперь я только что вызвал Collections.sort(items) в моем классе Inventory? - person bassandguitar; 21.04.2013
comment
Я так и думал, но когда я пишу Collections.sort(items); он говорит - Синтаксическая ошибка в элементах токена, VariableDeclaratorId ожидается после этого токена - Синтаксическая ошибка в токене (ах), неуместная конструкция (ы) - person bassandguitar; 21.04.2013
comment
Подождите, я только что получил это, я помещал это в тело класса, спасибо! - person bassandguitar; 21.04.2013
comment
Я ненавижу решения со ссылками. Это не решение. Одна из ваших ссылок мертва - person trixo; 17.09.2020
comment
@trixo обновлено. удалил неверную ссылку и добавил краткую реализацию по одной из ссылок с указанием источника :) - person Alex; 02.11.2020
comment
@Алекс спасибо :) - person trixo; 02.11.2020

Начиная с Java 8:

List<Item> items = new ArrayList<>();
// add elements
Collections.sort(items, Comparator.comparingLong(Item::getId));
person laffuste    schedule 05.02.2018

Есть две версии Collections.sort() .

Collections.sort (Список) и Collections.sort(List,Comparator) . Один берет List, а другой берет List и экземпляр Comparator. Единственный аргумент sort() предполагает, что ваш класс реализует Comparable и переопределил compareTo () метод. Метод с двумя аргументами sort() ожидает экземпляр Comparator, где вы внедрили Comparator и переопределили его compare().

Объект должен реализовывать Comparable, если это очевидный естественный способ сортировки класса, и любой, кому потребуется сортировать класс, обычно захочет сделать это таким образом.

Однако, если сортировка была необычным случаем использования класса или может быть несколько порядков сортировки, тогда Comparator является лучшим вариантом.

Также у меня есть вызов Collections.sort(items) сразу после того, как я объявлю свой ArrayList, это нормально?

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

Пример реализации:

public int compareTo (Item other) { 
   return new Integer(this.getID()).compareTo(new Integer(other.getID()));
}
person AllTooSir    schedule 21.04.2013
comment
Я должен использовать тот, который просто вызывает Collections.sort(items) - person bassandguitar; 21.04.2013
comment
Хорошо, но на основе какого поля? - person AllTooSir; 21.04.2013
comment
Что вы имеете в виду, я не понимаю, извините - person bassandguitar; 21.04.2013