Сортировать товар, если он есть на складе, то в порядке возрастания цены

#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);
 

Если вам нужна ссылка, у Белдунга есть хорошая страница с некоторыми примерами, которые вы могли бы взять.