当前位置: 首页 > 知识库问答 >
问题:

如何组合列表元素并找到最大组合的价格

端木朝
2023-03-14

我有一个类,其中包含特定项目的详细信息,如下所示:

Detail.class

Long detailsId;
Integer price;
List<Long> stackableDetails;

/*getters and setters*/

现在,我有一个示例数据集,如下所示:

    DetailId    Price    StackableDetails
------------------------------------------
    1011        4$       1012, 1014
    1012        6$       1011,1013
    1013        10$      1012
    1014        8$       1011

该数据集映射到List sample详细信息。现在,根据stackable详细信息,我必须组合详细信息并从中选择具有最大价格的组合。

For eg,
In the data set available, the possible combinations would be
1011,1012,1014 - 4+6+8 = 18$
1012,1011,1013 - 6+4+10 = 20$
1013,1012 - 10+6 = 16$
1014,1011 - 8+4 = 12$

现在,细节101210111013的组合产生20美元,所以我获取这个组合并将其添加到我的结果列表中。如何在java8中实现这一点。

感谢您的帮助。谢谢

共有2个答案

吴宝
2023-03-14

看着尤金斯的回答,我想应该工作得更短一点...这是另一个使用平面地图mapToDouble以及DoubleStreamsummax的变体:

double maxPrice = details.stream()
    .mapToDouble(detail -> Stream.concat(Stream.of(detail.getDetailsId()),
                                         detail.getStackableDetails().stream())
      .flatMap(detailId -> details.stream()
        .filter(candidateDetail -> detailId.equals(candidateDetail.getDetailsId())))
      .map(Detail::getPrice)
      .mapToDouble(value -> /* your transformation function */ (double) value)
      .sum()
    )
    .max()
    .orElse(0.0);

我想知道,为什么你可能只总结细节和它的直接堆叠的细节。对我来说,这听起来像是一个递归问题,但另一方面,你可能知道,你需要什么:-)

关于您的另一个问题:您可能只想将转换步骤替换为以下步骤:

.mapToDouble(Double::parseDouble)

请注意,您可以将double/mapToDouble等交换到最适合您的位置<然而,code>sum()仅适用于三个原始流:IntStreamLongStreamDoubleStream

杜昆琦
2023-03-14

首先,这有点误导。在你的问题中,你说从中选择价格最低的组合,但后来(和你的评论)你实际上提供了产生最大结果的样本。

假设您需要最大结果,您可以使用以下命令:

 long maxPrice = list
            .stream()
            .map(d -> Stream.concat(Stream.of(d.getDetailsId()), d.getStackableDetails().stream()))
            .map(s -> s.reduce(0L, (left, right) -> left +
                    list.stream()
                            .filter(dt -> dt.getDetailsId().equals(right))
                            .findAny()
                            .get()
                            .getPrice()))
            .max(Comparator.naturalOrder())
            .orElse(0L);

    System.out.println(maxPrice); // 20

编辑

好吧,你想通过最大价格进行比较,但是输出set制作这个价格。我唯一能想到的就是把它们放在TreeMap中,但恕我直言,这不是很可读。此外,当您有条目发生冲突时,也有这种情况——它们具有相同的最大价格。这个例子只是按遇到顺序取最后一个。

  List<Long> highest = list
            .stream()
            .map(d -> Stream.concat(Stream.of(d.getDetailsId()), d.getStackableDetails().stream()).collect(Collectors.toList()))
            .collect(Collectors.toMap(s -> s.stream().reduce(0L,
                    (left, right) -> left + list.stream().filter(dt -> dt.getDetailsId().equals(right)).findAny().get().getPrice()),
                    s -> s.stream().collect(Collectors.toList()),
                    (left, right) -> right,
                    TreeMap::new))
            .lastEntry().getValue();

编辑2

  Map<List<Long>, Long> map = list
            .stream()
            .map(d -> Stream.concat(Stream.of(d.getDetailsId()), d.getStackableDetails().stream()).collect(Collectors.toList()))
            .collect(Collectors.toMap(
                    s -> s.stream().collect(Collectors.toList()),
                    s -> s.stream().reduce(0L,
                            (left, right) -> left + list.stream().filter(dt -> dt.getDetailsId().equals(right)).findAny().get().getPrice()),
                    (left, right) -> right));
 类似资料:
  • 问题内容: 实现以下目标的Python方法是什么? 的每个成员都是一个元组,其第一个成员是,第二个成员是。 问题答案: 在Python 2中:

  • 问题内容: 假设我有3个列表:[‘q’,’w’],[‘a’,’s’],[‘z’,’x’]。如何从这些列表中获取可能的组合列表?所以我得到一个列表[[‘q’,’a’,’z’],[‘q’,’s’,’z’]]等。我为两个方法创建了一个方法,但对N个列表却找不到一个方法: 我发现这是由番石榴的Sets.cartesianProduct完成的。 问题答案: 您需要N个嵌套循环,这使它变得很难。 您可以使用递

  • 我想要一个列表,它是列表元素列表的组合,例如:我的输入 输出应该是 非常感谢您的帮助。

  • 我有一本字典。 我想找到两个元素的组合,其中每个元素必须来自不同的判决键。 例如:就是这样的组合,而不是这样的组合。 我已经试过这个了 但是它给了和两个不同的组合,但是我只想要其中一个。

  • 我做了一个代码,应该显示数组中元素排列的整个组合。 应该是什么: 123 213 231 132 312 321 但结果是这样的: 231 312 123 231 312 123 如何以应有的方式进行排列?

  • 问题内容: 我有一个〜10 ^ 6元组的列表,像这样: 我想在此列表中找到Y的最大值,但也想知道绑定到的X。 我该怎么做呢? 问题答案: 用途: 使用: 使用: 比较: