#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 ), вы можете отсортировать список объектов внутри корзины на основе значения популярности в порядке убывания и получить первые три элемента после сортировки.