【问题标题】:Map that associate a rating and a list of products java关联评级和产品列表的映射 java
【发布时间】:2020-06-24 22:03:52
【问题描述】:

我有产品,每个产品都有评分。 我尝试的是:

   public SortedMap<Double, List<String>> getProductsPerStars () {
            SortedMap<Double, List<String>> productsPerStars = new TreeMap<>();
            List<String> ps = new ArrayList<>();
            for(Product p : products.values()) {
                for(Rating r : ratings) {
                    System.out.println(r.getNumStars() + " " + r.getProductName());
                    if(r.getProductName() == p.getName()) {
                        System.out.println(this.getStarsOfProduct(p.getName()));
                        ps.add(p.getName());
//                  productsPerStars.put(key, value)

                    }
                }
            }
            System.out.println(ps);
            return productsPerStars;
        }

getProductsPerStars() 方法给出了一个映射,该映射将平均星数与具有该平均值的产品名称列表相关联,平均值按降序排列,产品名称按字母顺序排列。没有评论的产品将被丢弃。

输出必须如下所示:

{4.0=[p2], 2.0=[p0, p1]}

我认为最好用流来做到这一点......但我不知道如何(因为我有一些错误......)。 你能帮帮我吗?

【问题讨论】:

  • 你有什么错误?顺便说一句:您将Strings 与== 进行比较,不要那样做。
  • 我在尝试处理流时出错(我不知道如何使用lamba 函数...)抱歉== 但不是这个问题。
  • 忽略任何可能的流解决方案并手动执行此操作。你从来没有将你的ps 列表添加到productsPerStars,为什么?
  • 我必须列出产品列表,然后为每个评级关联产品列表,但我不知道如何...
  • 哎呀:r.getProductName() == p.getName() 没有做你希望做的事。 Use r.getProductName().equals(p.getName()) instead.

标签: java collections java-stream


【解决方案1】:

试试这个:

SortedMap<Double, List<String>> productsPerStars = new TreeMap<>(
    ratings.stream().collect(groupingBy(Rating::getNumStars, Rating:: getProductName))
);

【讨论】:

  • r.getNumStars() 从评论中返回每个产品的星数(不是平均评分)
猜你喜欢
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
  • 2016-05-24
相关资源
最近更新 更多