gpt4 book ai didi

java - List 中基于另一个元素的最大值

转载 作者:行者123 更新时间:2023-12-02 07:42:06 25 4
gpt4 key购买 nike

我需要找出属于另一个元素的最大值。给你举个例子最清楚了。

我有List<String> lines包含以下数据:

1, 1, A, Aaa ...
1, 2, A, Aaa ...
1, 4, A, Aaa ...
2, 5, B, Bbb ...
2, 3, B, Bbb ...
3, 6, C, Ccc ...
4, 7, D, Ddd ...
5, 8, E, Eee ...
1, 9, A, Aaa ...
4, 10, D, Ddd ...

需要明确的是,两对数字永远不会相同,所以你永远不会得到:

1, 9, A, Aaa ...
1, 9, B, Bbb ...

我的目标是提取属于第一行的第二行的最大值的行。确切地说,这些行:

1, 9, A, Aaa ...
2, 5, B, Bbb ...
3, 6, C, Ccc ...
4, 10, D, Ddd ...
5, 8, E, Eee ...

为了向您证明这不是作业,我使用多个 for-loop 制作了解决方案找到最大值并将其存储到变量中。但是我不知道它是否有效,因为测试了大量数据( 200 000+ )。

// List "lines" is declared above

List<List<String>> data = new ArrayList<>();
List<List<String>> maxValues = new ArrayList<>();

// clear and separate to clear comparable parts
for (String s: lines) {
String parts[] = s.trim().replace("\"", "").split(";");
List newList = Arrays.asList(parts);
data.add(newList);
}

// naïve algorithm to find the maximum dependent to the another one
// not sure if working
for (List l: data) {
int id = Integer.parseInt(l.get(0).toString());
int max = 0;
List<String> tempMaxValues = new ArrayList<>();
for (int i=0; i<data.size(); i++) {
if (Integer.parseInt(l.get(0).toString()) == id) {
int temp = Integer.parseInt(l.get(1).toString());
if (temp > max) {
max = temp;
tempMaxValues = l;
}
}
}
maxValues.add(tempMaxValues);
}

此外,我还需要进行更多计算。只有使用 Stream 才能达到我想要的结果或者更简单的方法?即使在我的代码中我也会迷失和困惑。

最佳答案

用功能术语来说,您想要的是将每个列表值按其第一个元素进行分组,并仅选择第二个元素的最大值。使用 Stream API,您可以:

  1. 使用 groupingBy(classifier, downstream) 收集器按列表的第一个元素进行分组。
  2. 应用于分类到同一键的所有值的下游收集器是 maxBy(comparator) 仅选择收集值中的最大值。在这种情况下,比较器将每个列表的第二个值作为 int 进行比较。借助内置 comparingInt .
  3. maxBy返回 Optional 如果没有收集任何值,我们通过调用 collectingAndThen(finisher) 来包装它其中整理器检索 Optional通过调用 Optional.get() 值(我们知道在这种情况下至少有一个值将被分类) .
  4. 最后,我们只保留 values() 从结果 Map<String, List<String>>并且,因为这会返回 Collection<List<String>> ,我们创建一个 ArrayList以此为基础。

示例代码:

List<List<String>> maxValues = new ArrayList<>(
data.stream()
.collect(Collectors.groupingBy(
l -> l.get(0),
Collectors.collectingAndThen(
Collectors.maxBy(Comparator.comparingInt(l -> Integer.parseInt(l.get(1)))),
Optional::get
)
))
.values()
);

结果

[1, 9, A, Aaa], [2, 5, B, Bbb], [3, 6, C, Ccc], [4, 10, D, Ddd], [5, 8, E, Eee]]

用于您的示例数据。

关于java - List 中基于另一个元素的最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36105656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com