Прикрепить значения к элементам списка в Java - PullRequest
0 голосов
/ 07 марта 2019

У меня есть список целых чисел, из которых я посчитал повторения и распечатал их, используя карту.Теперь каждому из этих целых чисел в списке Items должно быть присвоено определенное значение.

Мой вывод:

2 x 3

8 x 1

В конечном итоге я пытаюсь достичьэто:

2 x 3 $5.50

8 x 1 $12.50

Total = $29

, что означает, что целые числа 2 и 8 имеют значения, скажем, $ 5.50 и $ 12.50 соответственно.

  1. Какой наилучший способ в Java назначитьзначение целых чисел в этом списке?

  2. Как я могу обработать расчет?

Программа принимает заказы на хлебобулочные изделия - общее количество вместе с кодами в качестве ввода.Например, 14 кексов.И у каждого предмета есть набор доступных пакетов (скажем, 2,5,8) каждый со своей стоимостью.Я использовал алгоритм смены монет, чтобы разбить 14 кексов в доступных упаковках.

например, Ввод = 14 кексов

Ожидаемый результат:

14 кексов $ 54,8

1 x 8 $ 24,95

3 x 2 $ 9,95

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

Вот мой код для получения дубликатов из списка:

public static void packagesprint() {
        List<Integer> items = Arrays.asList(8, 2, 2, 2);

        Map<Integer, Long> result = items.stream()
                .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

        for (Map.Entry<Integer,Long> entry : result.entrySet())
            System.out.println(entry.getKey() + " x "+
                    + entry.getValue());    
    }

Выходы:

2x3

8x1

Ответы [ 2 ]

2 голосов
/ 07 марта 2019

Звучит как какая-то визитная карточка. Я бы использовал каталог товаров (который мог бы храниться в базе данных):

public class Catalogue {
    public Product getProductById(int id) {
        // ...
    }

    // ...
}

public class Product {
    private int id;
    private String label;
    private double price;
    // ...

    public int getId() {
        return id;
    }

    public String getLabel() {
        return label;
    }

    public double getPrice() {
        return price;
    }

    // ...
}

И я бы определил класс Order, который будет коллекцией OrderItem. каждая вещь является количеством и продуктом. Для группировки товаров в заказе вы можете использовать карту с идентификатором продукта в качестве ключа:

public class OrderItem {
    private int quantity;
    private Product product;

    public OrderItem(int quantity, Product product) {
        this.quantity = quantity;
        this.product = product;
    }

    public int getQuantity() {
        return quantity;
    }

    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

    public Product getProduct() {
        return product;
    }

    public double getAmount() {
        return quantity*product.getPrice();
    }
}

public class Order {
    private final Map<Integer,OrderItem> items = new HashMap<>();

    public Iterable<OrderItem> getItems() {
        return new ArrayList<>(items.values());
    }

    public void add(int quantity, Product product) {
        OrderItem item = items.get(product.getId());
        if (item != null) {
            item.setQuantity(item.getQuantity() + quantity);
        } else {
            items.put(product.getId(), new OrderItem(quantity, product));
        }
    }

    public void add(Product product) {
        add(1, product);
    }

    public void add(OrderItem item) {
        add(item.getQuantity(), item.getProduct());
    }

    public double getTotal() {
        double total = 0;
        for (OrderItem item: items.values()) {
            total += item.getAmount();
        }
        return total;
    }
    // ...
}

Теперь вы можете создать свой заказ из списка идентификаторов продуктов следующим образом:

    List<Integer> items = Arrays.asList(8, 2, 2, 2);
    Order order = new Order();
    for (int id: items) {
        order.add(catalogue.getProductById(id));
    }

А затем вычислите сумму с помощью getTotal():

    System.out.println(order.getTotal());
2 голосов
/ 07 марта 2019

Существует много возможных способов решения этой проблемы. Я представлю вам несколько возможностей.

  1. Первый возможный способ - создать новый объект, содержащий ключ, значение и количество дубликатов. Это хороший подход, поскольку у вас есть все необходимые данные в одном объекте.

См. Ниже для реализации:

public class MyObject{
    private int id;
    private double value;
    private int numberOfDuplicates;

    public MyObject(){
        this.id = 0;
        this.value = 0;
        this.numberOfDuplicates = 0;    
    }

    public MyObject(int id, double value, int numberOfDuplicates){
        this.id = id;
        this.value = value;
        this.numberOfDuplicates = numberOfDuplicates;    
    }

    // INSERT GETTERS AND SETTERS BELOW
}

Тогда вы будете использовать это так:

public static void packagesprint() {
        List<Integer> items = Arrays.asList(8, 2, 2, 2);
        List<MyObject> myObjectList =  ArrayList<>();

        Map<Integer, Long> result = items.stream()
                .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

        for (Map.Entry<Integer,Long> entry : result.entrySet()){
            MyObject myObject = new MyObject();
            myObject.setId(entry.getKey());
            myObject.setNumberOfDuplicates(entry.getValue().intValue()); 
            myObject.setValue(value); // <- this is where you set your value, e.g. if 2's value is 5.50, then set 5.50 as value 
            myObjectList.add(myObject);
        }

}
  1. Другой возможный подход заключается в том, что вы можете использовать HashMap и установить 2 в качестве ключа и "5.50" в качестве значения. Недостатком этого подхода является то, что вам все равно придется искать значение числа дубликатов на другой карте (в вашем случае карта result).

См. Ниже для реализации:

public static void packagesprint() {
        List<Integer> items = Arrays.asList(8, 2, 2, 2);
        Map<Integer, Double> keyValuePairs = new HashMap<Integer, Double>();

        Map<Integer, Long> result = items.stream()
                .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

        for (Map.Entry<Integer,Long> entry : result.entrySet()){
            keyValuePairs.put(entry.getKey(), value) // <- this is where you set your value, e.g. if 2's value is 5.50, then set 5.50 as value 
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...