Java流将整数列表划分为3个部分,并将每个部分相加
我需要将整数列表分成相等的部分,并打印每个数组的和 例[4,2,3,4,1,1,1,2,1] 除以[4,2,3]、[4,1.1]、[1,2,1]和每个最终输出的总和964 需要使用Java8流api吗Java流将整数列表划分为3个部分,并将每个部分相加,java,java-8,Java,Java 8,我需要将整数列表分成相等的部分,并打印每个数组的和 例[4,2,3,4,1,1,1,2,1] 除以[4,2,3]、[4,1.1]、[1,2,1]和每个最终输出的总和964 需要使用Java8流api吗 AtomicInteger counter = new AtomicInteger(0); Integer[] array = {4, 2, 3, 4, 1, 1, 1, 2, 1}; Arrays.asList(array).stream().collect(Collectors.grou
AtomicInteger counter = new AtomicInteger(0);
Integer[] array = {4, 2, 3, 4, 1, 1, 1, 2, 1};
Arrays.asList(array).stream().collect(Collectors.groupingBy(it -> counter .getAndIncrement() / 3)).forEach((k,v)->System.out.println(k + " " + v));
它打印
{0=[4, 2, 3], 1=[4, 1, 1], 2=[1, 2, 1]}
我需要打印每个部分的总和
964
谢谢您可以在拥有
地图的位置停止问题
:{0=[4,2,3],1=[4,1,1],2=[1,2,1]}
你需要
- 迭代不同的
列表
- 将它们的元素求和
- 打印它们(或收集它们以生成
)int
字符串
String res = Arrays.asList(array).stream()
.collect(Collectors.groupingBy(it -> counter .getAndIncrement() / 3))
.values().stream()
.map(val-> val.stream().mapToInt(Integer::intValue).sum())
.map(String::valueOf)
.collect(Collectors.joining());
System.out.println(res);
较短但不可读的方法可以是:
- 迭代
,在您的示例中用ints
分隔:0、3、6、9李>3
- 将每个值映射到从
到index
index+3
不要使用外部计数器。由于流不能保证特定的处理顺序,因此不能保证计数器更新能够真实反映实际的元素位置 直截了当的解决方案没有那么复杂:
int[] array = {4, 2, 3, 4, 1, 1, 1, 2, 1};
int chunks = 3, chunkSize = array.length/chunks;
IntStream.range(0, chunks).forEach(i -> System.out.println(i+" "
+Arrays.stream(array, i*=chunkSize, i+chunkSize).sum()));
如果数组长度不能被三整除,则这将忽略多余的元素
如果数组确实是Integer[]
而不是int[]
,则必须取消对元素的装箱:
Integer[] array = {4, 2, 3, 4, 1, 1, 1, 2, 1};
int chunks = 3, chunkSize = array.length/chunks;
IntStream.range(0, chunks).forEach(i -> System.out.println(i+" "
+Arrays.stream(array, i*=chunkSize, i+chunkSize)
.mapToInt(Integer::intValue)
.sum()));
上述解决方案适用于“将整型列表分成3部分”,与您的问题标题相匹配。如果您想拆分为长度为3的部分,只需将解决方案更改为
int chunkSize = 3;
IntStream.range(0, array.length/chunkSize).forEach(i -> System.out.println(i+" "
+Arrays.stream(array, i*=chunkSize, i+chunkSize)
.mapToInt(Integer::intValue)
.sum()));
如果要通过处理最后一个可能较短的块来处理不能被chunkSize
整除的数组长度,可以使用
Integer[] array = {4, 2, 3, 4, 1, 1, 1, 2, 1, 100};
int chunkSize = 3;
IntStream.range(0, (array.length+chunkSize-1)/chunkSize)
.forEach(i -> System.out.println(i+" "
+Arrays.stream(array, i*=chunkSize, Math.min(i+chunkSize, array.length))
.mapToInt(Integer::intValue)
.sum()));
这只是一个需求列表。这不是问题。对不起,我们不是免费的代码编写服务。如果大小是素数呢?比如7,你怎么划分它?在1的子列表中?抱歉,michael,我知道如何从java 7中执行此操作,但我需要从java 8 Integer[]数组={4,2,1,4,0,1,0,2,0};Arrays.asList(array.stream().collect(Collectors.groupingBy(it->counter2.getAndIncrement()/3)).forEach((k,v)->System.out.println(k+“”+v));共享您的Java7代码,因为通常会有多种可能实现“相等部分”。对于长度为20:2x10、4x5、5x4、10x2的数组,您的代码将数组拆分为长度为3的部分,而不是长度为3的部分。当源数组正好有九个元素时,它恰好是相同的want@user3322836不客气,唐“不要犹豫投票赞成或接受。但是有一个问题,你硬编码的
3
数组是10长还是20长?azro我还有另一个问题,不需要打印这个,我需要返回字符串,因为字符串意味着字符串returnFunct(int[]arry]){................/..return 952}azro其他问题我有int数组{1,2,3,4,5}需要将它划分为列表长度3,如{1,2,3}{2,3,4},{3,4}和每个数组的总和。带有3个参数的stream
让我今天学到了一些新东西,谢谢!
int chunkSize = 3;
IntStream.range(0, array.length/chunkSize).forEach(i -> System.out.println(i+" "
+Arrays.stream(array, i*=chunkSize, i+chunkSize)
.mapToInt(Integer::intValue)
.sum()));
Integer[] array = {4, 2, 3, 4, 1, 1, 1, 2, 1, 100};
int chunkSize = 3;
IntStream.range(0, (array.length+chunkSize-1)/chunkSize)
.forEach(i -> System.out.println(i+" "
+Arrays.stream(array, i*=chunkSize, Math.min(i+chunkSize, array.length))
.mapToInt(Integer::intValue)
.sum()));