Нахождение 3 самых распространенных элементов в массиве - PullRequest
0 голосов
/ 11 марта 2019

Мой код довольно длинный, но я включу соответствующий фрагмент. Я создаю графический интерфейс с элементами магазина. У меня есть текстовое поле PopularItemsTxt, которое содержит 3 самых популярных элемента из моего списка.

for(int i =0; i<3;i++) {
    if(electronicStore.stock[i] != null) {
    popularTxt.getItems().add(electronicStore.stock[i].toString());
    }
}

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

 btnComplete.setOnAction(new EventHandler<ActionEvent>() {
         public void handle(ActionEvent e) {

            //if the list has a minimum of 1 item
             if (currentCartTxt.getItems().size() > 0) {
              for(int i =0; i<3;i++) {
                            if(electronicStore.stock[i] != null) {
                                popularTxt.getItems().add(electronicStore.stock[i].toString());
                                List<ElectronicStore> topThree = Arrays.stream(electronicStore.stock)
                                         .sorted(Comparator.comparing(ElectronicStore::createStore).reversed())
                                         .limit(3)
                                         .collect(Collectors.toList());
                            }
                        }
    }        
});

Прямо сейчас вывод - это просто первые три элемента в моем массиве. Я получаю ошибку при сравнении

Ответы [ 2 ]

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

Предполагая, что stock - это Array объектов, имеющих поле int, например, представления, которые вы используете для оценки популярности, вы можете (java 8+) использовать Streams для достижения этой цели:

Class[] topThree =  Arrays.stream(stock)
                          .sorted(Comparator.comparingInt(Class::getViews).reversed())
                          .limit(3)
                          .toArray(Class[]::new);

Где getViews - это метод, который извлекает сравниваемое свойство int, а Class - тип объекта, хранящегося в stock

.

Или, если вы хотите List<Class>:

List<Class> topThree = Arrays.stream(stock)
                             .sorted(Comparator.comparingInt(Class::getViews).reversed())
                             .limit(3)
                             .collect(Collectors.toList());

Или, глядя на ваш пример, выглядит так, как будто вы просто хотите добавить String представление объектов к popularTxt:

Arrays.stream(stock)
      .sorted(Comparator.comparingInt(Class::getViews).reversed())
      .limit(3)
      .map(Class::toString)
      .forEach(popularTxt.getItems()::add);
0 голосов
/ 11 марта 2019

Каждый элемент в магазине (при условии, что элементы являются объектами) должен иметь свойство, указывающее его популярность (переменная типа int).Каждый раз, когда товар добавляется в корзину, увеличивайте переменную индикатора популярности на 1, а когда товар по какой-то причине убирают, уменьшите значение на 1. Это можно сделать в слушателе действий кнопки «добавить» и «удалить».методы.

Итак, наконец, когда корзина (при условии, что это также список объектов) завершена (то есть, когда нажата btnComplete), вы можете отсортировать список объектов внутри корзины, основываясь на значении популярности в нисходящем порядке.заказать и получить первые три элемента после сортировки.

...