Отсортировать коллекцию по двум полям

340
02 июня 2017, 11:47

Имеется следующий код:

public Product() {}
public Integer getCod() {
    return cod;
}
public void setCod(Integer cod) {
    this.cod = cod;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public Integer getNumber() {
    return number;
}
public void setNumber(Integer number) {
    this.number = number;
}
public String getDescription() {
    return description;
}
public void setDescription(String description) {
    this.description = description;
}
public Double getPrice() {
    return price;
}
public void setPrice(Double price) {
    this.price = price;
}
public Double getDiscount() {
    return discount;
}
public void setDiscount(Double discount) {
    this.discount = discount;
}
public Integer getBatchQuantity() {
    return batchQuantity;
}
public void setBatchQuantity(Integer batchQuantity) {
    this.batchQuantity = batchQuantity;
}
@Override
public String toString() {
    return "Product{" +
            "cod=" + cod +
            ", name='" + name + '\'' +
            ", number=" + number +
            ", description='" + description + '\'' +
            ", price=" + price +
            ", discount=" + discount +
            ", batchQuantity=" + batchQuantity +
            '}';
}
}

И следующий код кнопки сортировщика:

/**
 * Кнопка сортировщик
 */
@FXML
public void onSortAction() {
    loadData();
    message.setText("");
    // сортировка по возрастанию названия и цены
    if (nameAsc.isSelected() == true && priceAsc.isSelected() == true) {
        List sortedProductList = productList.stream().sorted((o1, o2) ->
                -o1.getName().compareTo(o2.getName())).collect(Collectors.toList());
        sortedProductList = productList.stream().sorted((o1, o2) ->
                -o1.getPrice().compareTo(o2.getPrice())).collect(Collectors.toList());
        productList = new ArrayList<Product>();
        productList = sortedProductList;
    }
}

По одному полю я смог отсортировать, как сделать так чтобы по обоим полям можно было сортировать данный список?

Answer 1

Для сортировки по нескольким полям удобно использовать компараторы (java.util.Comparator) с их цепочками вызовов типа comparing().thenComparing().thenComparing()...

Описание метода thenComparing

да и код можно подсократить, не теряя в его понятности.
вот мой вариант функции:

public void onSortAction() {
    loadData();
    message.setText("");
    // сортировка по возрастанию названия и цены
    // сначала сравниваются названия, при равенстве названий сравниваются цены
    if (nameAsc.isSelected() == true && priceAsc.isSelected() == true) {
        List sortedProductList = productList.stream().sorted(
            Comparator.comparing(Product::getName).thenComparing(Product::getPrice)
        ).collect(Collectors.toList());
        productList = sortedProductList;
    }
}
Answer 2

Дополнение: обратите внимание на другой ответ, на мой взгляд он понятнее и удобнее.

Вам нужно решить, какой из ключей является главным при сортировке, и сначала сравнивать объекты по этому ключу, а при равенстве главных ключей сравнивать второстепенные ключи. Ниже приведён код в предположении, что главным ключом является поле «название».

public void onSortAction() {
    loadData();
    message.setText("");
    // сортировка по возрастанию названия и цены
    // сначала сравниваются названия, при равенстве названий сравниваются цены
    if (nameAsc.isSelected() == true && priceAsc.isSelected() == true) {
        List sortedProductList = productList.stream().sorted((o1, o2) -> {
            int compareNames = -o1.getName().compareTo(o2.getName());
            return compareNames != 0
                    ? compareNames
                    : -o1.getPrice().compareTo(o2.getPrice());
        }).collect(Collectors.toList());
        productList = sortedProductList;
    }
}
READ ALSO
Как перенаправить запрос из Servlet в JSP?

Как перенаправить запрос из Servlet в JSP?

ЗдравствуйтеПытаюсь сделать так, чтобы Servlet перенаправил запрос в JSP

426
Вопрос про VK api [требует правки]

Вопрос про VK api [требует правки]

Какие есть инструменты статистики для vk api?

234
Как добавить текст в toolbar android?

Как добавить текст в toolbar android?

Необходимо в стандартный toolbar (Не отдельная View) добавить какой-либо текст помимо заголовкаИконки как добавлять я знаю, а вот с текстом проблема

319
Java массив ,инициализация [требует правки]

Java массив ,инициализация [требует правки]

Как провести правильную инициализацию? Приложение крашитсяВидимо ошибка в строчке arr[0]

270