【问题标题】:Finding the 3 most common elements in an array查找数组中最常见的 3 个元素
【发布时间】:2019-03-11 01:39:55
【问题描述】:

我的代码很长,但我会包含相关的 sn-p。我正在创建一个带有商店元素的 GUI。我有一个名为 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());
                            }
                        }
    }        
});

现在输出只是我的数组列表中的前三个项目。 比较时出现错误

【问题讨论】:

  • 如果您已经有了选择的商品列表和确定每个商品的受欢迎程度的方法,最简单的方法是按照受欢迎程度对购买的商品进行排序,只查看前三个。我是否遗漏了某些东西或者那会起作用吗?
  • 这正是我的想法,但我不知道如何对最常见的项目进行排序

标签: java listview user-interface actionevent


【解决方案1】:

假设stock 是具有int 字段的对象的Array,例如您用来判断受欢迎程度的视图,您可以(java 8+)使用Streams 来完成此操作:

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

其中getViews 是检索您要比较的int 属性的方法,Class 是存储在stock 中的对象的类型

或者如果你想要List&lt;Class&gt;:

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

或者看你的例子,看起来你只是想将对象的Stringrepresentation 添加到popularTxt

Arrays.stream(stock)
      .sorted(Comparator.comparingInt(Class::getViews).reversed())
      .limit(3)
      .map(Class::toString)
      .forEach(popularTxt.getItems()::add);

【讨论】:

  • 嗨,好吧,所以我实现了你的方法,但是我对 JAVA 很陌生,所以我以前从未见过比较器工具。我收到 (Class::getRating) 的错误,知道为什么吗?我已经更新了我的代码
  • @coding101 没有看到类的代码很难说。 ClassgetViews 是您的类名和方法名的占位符名称。
  • 好吧,我会使用什么方法?因为我的 getStock() 方法只是返回我所有股票的列表
  • @coding101 您如何确定对象的受欢迎程度?
【解决方案2】:

商店中的每件商品(假设商品是对象)都应该有一个属性来指示其受欢迎程度(一个 int 成员变量)。每次将商品添加到购物车时,将流行度指示器变量增加 1,当商品由于某种原因被移除时,也会将值减少 1。这可以在“添加”和“删除”按钮操作侦听器中完成方法。

所以最后,当购物车(假设这也是对象列表)完成时(即按下 btnComplete 时),您可以根据流行度值按降序对购物车内的对象列表进行排序,并且得到排序后的前三项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    相关资源
    最近更新 更多