#java #sorting #compareto
Вопрос:
Я выполняю упражнение по компаратору Java, в котором меня просят отсортировать товары по тому, есть ли они на складе, а затем в порядке возрастания по их цене. Для получения более подробной инструкции, пожалуйста, прочитайте комментарий в классе PriceStockComparator.
import java.util.Comparator;
import java.util.Collections;
public class Product {
private String name;
private int priceCents;
private int stockLevel;
public Product(String name, int priceCents, int stockLevel) {
this.name = name;
this.priceCents = priceCents;
this.stockLevel = stockLevel;
}
@Override
public String toString() {
return this.name ": " this.stockLevel " @ $" this.priceCents / 100.0;
}
/**
* This comparator should sort products by whether or not they are in stock,
* then in ascending order by their price.
*
* After sorting, products that have a positive stock level should appear
* before products that have a stock level of 0. If two products being
* sorted are either 1) both in stock; or 2) both out of stock, they
* should then be sorted based on their price in ascending order.
*/
static class PriceStockComparator implements Comparator<Product> {
@Override
public int compare(Product p1, Product p2) {
// write your code here
return Integer.compare(p1.stockLevel, p2.stockLevel);
}
}
}
Я получил 4 ошибки в своей программе
=> java.lang.AssertionError: expected:<[Apple: 5 @ $1.0, Bottled Water: 2 @ $2.0, Donut: 7 @ $4.0]> but was:<[Bottled Water: 2 @ $2.0, Apple: 5 @ $1.0, Donut: 7 @ $4.0]>
=> java.lang.AssertionError: expected:<[Apple: 5 @ $1.0, Bottled Water: 2 @ $2.0, Donut: 7 @ $4.0, Fish: 3 @ $6.0, Crackers: 0 @ $3.0, Eggs: 0 @ $5.0]> but was:<[Crackers: 0 @ $3.0, Eggs: 0 @ $5.0, Bottled Water: 2 @ $2.0, Fish: 3 @ $6.0, Apple: 5 @ $1.0, Donut: 7 @ $4.0]>
=> java.lang.AssertionError: expected:<[Crackers: 0 @ $3.0, Eggs: 0 @ $5.0]> but was:<[Eggs: 0 @ $5.0, Crackers: 0 @ $3.0]>
=> java.lang.AssertionError: expected:<[Donut: 7 @ $4.0, Fish: 3 @ $6.0, Eggs: 0 @ $5.0]> but was:<[Eggs: 0 @ $5.0, Fish: 3 @ $6.0, Donut: 7 @ $4.0]>
Это потому, что я сортирую уровень запасов, но сначала не могу сделать его положительным, и я не сортировал порядок возрастания цены. Я не думаю, что мог бы использовать здесь два compareTo (), и я намерен использовать Collection.sort
их при сортировке в порядке возрастания цены. Но я не знаю, как это сделать. Я был бы рад, если бы кто-нибудь мог помочь. Спасибо!
Ответ №1:
Вы можете написать свой метод compareTo следующим образом:
public int compare(Product p1, Product p2) {
//If both the products are in stock or are not in stock
// we can compare them on price
if(p1.getStockLevel()>0 amp;amp; p2.getStockLevel()>0 ||
p1.getStockLevel()<=0 amp;amp; p2.getStockLevel()<=0)
return Integer.compare(p1.getPriceCents(), p2.getPriceCents());
// If the first product is not in stock then we move it down the list
// by returning a -1
else if(p1.getStockLevel()>0 amp;amp; p2.getStockLevel()<=0)
return -1;
// If second product is not in stock but first one
else
return 1;
}
Комментарии:
1. На самом деле я не могу использовать метод get, так как я его не реализовал, но я знаю, что вы имеете в виду. Спасибо.
2. Пожалуйста. Да, на данный момент используйте переменную непосредственно p1.stockLevel, но хороший подход-иметь геттеры и сеттеры на будущее.
Ответ №2:
Вы можете использовать лямбда-выражения Java 8. Компилятор способен выводить определения типов. Если ваш объектный продукт находится в списке, вы можете сделать следующее…
List<Product> products = new ArrayList<>();
Collections.sort(products, (a,b) -> a.priceCents - b.priceCents);
Если вам нужна ссылка, у Белдунга есть хорошая страница с некоторыми примерами, которые вы могли бы взять.