Имеется следующий код:
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;
}
}
По одному полю я смог отсортировать, как сделать так чтобы по обоим полям можно было сортировать данный список?
Для сортировки по нескольким полям удобно использовать компараторы (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;
}
}
Дополнение: обратите внимание на другой ответ, на мой взгляд он понятнее и удобнее.
Вам нужно решить, какой из ключей является главным при сортировке, и сначала сравнивать объекты по этому ключу, а при равенстве главных ключей сравнивать второстепенные ключи. Ниже приведён код в предположении, что главным ключом является поле «название».
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;
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
ЗдравствуйтеПытаюсь сделать так, чтобы Servlet перенаправил запрос в JSP
Необходимо в стандартный toolbar (Не отдельная View) добавить какой-либо текст помимо заголовкаИконки как добавлять я знаю, а вот с текстом проблема
Как провести правильную инициализацию? Приложение крашитсяВидимо ошибка в строчке arr[0]