gpt4 book ai didi

Java流减少

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:57:34 27 4
gpt4 key购买 nike

我有以下示例数据集,我想根据方向值使用 Java stream api 转换/减少

Direction    int[]
IN 1, 2
OUT 3, 4
OUT 5, 6, 7
IN 8
IN 9
IN 10, 11
OUT 12, 13
IN 14

Direction    int[]
IN 1, 2,
OUT 3, 4, 5, 6, 7
IN 8, 9, 10, 11
OUT 12, 13
IN 14

到目前为止我写的代码

enum Direction { IN, OUT }

class Tuple {
Direction direction;
int[] data;

public Tuple merge(Tuple t) {
return new Tuple(direction, concat(getData(), t.getData()));
}
}

private static int[] concat(int[] first, int[] second) {
int[] result = Arrays.copyOf(first, first.length + second.length);
System.arraycopy(second, 0, result, first.length, second.length);
return result;
}

List<Tuple> reduce = tupleStream.reduce(new ArrayList<>(), WDParser::add, WDParser::combine);

private static List<Tuple> combine(List<Tuple> list1, List<Tuple> list2) {
System.out.println("combine");
list1.addAll(list2);
return list1;
}

private static List<Tuple> add(List<Tuple> list, Tuple t) {
System.out.println("add");
if (list.size() == 0) {
list.add(t);
} else if (list.size() > 0) {
int lastIndex = list.size() - 1;
Tuple last = list.get(lastIndex);
if (last.getDirection() == t.getDirection())
list.set(lastIndex, last.merge(t));
else
list.add(t);
}

return list;
}

我相信有更好、更简单的替代方法来实现同样的目标。

我找到的关于 Java stream api reduce/combine 的在线示例和博客仅使用 Integer::sum 函数。希望为更复杂的案例场景构建它。

最佳答案

我认为您的解决方案已经很不错了,尤其是与收集到共享的外部容器中相比,使用缩减可以轻松实现并行性。但正如 Holger 指出的那样,使用 collect 而不是 reduce 更容易。此外,累加器中的条件可以简化一点,您忘记合并组合器中的最后一个和第一个元素:

List<Tuple> reduce = tupleStream.collect(ArrayList::new, WDParser::add, WDParser::combine);

private static List<Tuple> combine(List<Tuple> list1, List<Tuple> list2)
{
if (!list2.isEmpty())
{
add(list1, list2.remove(0)); // merge lists in the middle if necessary
list1.addAll(list2); // add all the rest
}
return list1;
}

private static List<Tuple> add(List<Tuple> list, Tuple t)
{
int lastIndex = list.size() - 1;
if (list.isEmpty() || list.get(lastIndex).getDirection() != t.getDirection())
{
list.add(t);
}
else
{
list.set(lastIndex, list.get(lastIndex).merge(t));
}
return list;
}

您甚至可以使用 LinkedList 和方法 add/removeFirst/Last() 而不是使用索引来访问第一个/最后一个元素。

关于Java流减少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52169828/

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