Поиск 3 наиболее распространенных элементов в массиве

#java #listview #user-interface #actionevent

#java #просмотр списка #пользовательский интерфейс #actionevent

Вопрос:

Мой код довольно длинный, но я включу соответствующий фрагмент. Я создаю графический интерфейс с элементами хранилища. У меня есть текстовое поле под названием 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());
                            }
                        }
    }        
});
  

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

Комментарии:

1. Если у вас уже есть список выбранных элементов и средство определения популярности для каждого элемента, самый простой способ — отсортировать купленные элементы по популярности и посмотреть только на первые три. Я что-то упускаю или это сработает?

2. Это именно то, о чем я думал, однако я не был уверен, как сортировать наиболее часто встречающиеся элементы

Ответ №1:

Предполагая, что stock есть Array набор объектов, у которых есть поле int, такое как views, которое вы используете для оценки популярности, вы можете (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);
  

Комментарии:

1. Привет, хорошо, я реализовал ваш метод, однако я довольно новичок в JAVA, поэтому я никогда не видел, чтобы инструмент сравнения использовался раньше. Я получаю сообщение об ошибке для (Class:: getRating), есть идеи, почему? Я обновил свой код

2. @coding101 Трудно сказать, не видя кода для классов. Class , и getViews были имена заполнителей для вашего имени класса и имени метода.

3. хорошо, какой метод я бы использовал? потому что мой метод getStock () просто возвращает список всех моих запасов

4. @coding101 Как вы определяете популярность объектов?

Ответ №2:

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

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