从列表中创建固定大小的子列表,如果元素少,则添加零以完成子列表

时间:2018-02-17 04:09:47

标签: java list generics collections

我是Java 8的新手,并尝试从列表中创建固定大小为5个元素的分区。 如果列表缺少元素,那么我需要为它添加零。

例如:如果原始列表包含以下元素: [1,2,3,4,5,6,7]

子列表如下: [1,2,3,4,5],[6,7,0,0,0]

到目前为止,我找到了以下方法。 如果子列表小于5,有人可以帮我更改这个以添加零吗?

public static <T> List<List<T>> splitLists(List<T> alist, final int len) {
    return IntStream.range(0, alist.size()) 
            .filter(i -> i % len == 0) 
            .boxed() 
            .map(i -> alist.subList(i, Math.min(i + len, alist.size()))) 
            .collect(Collectors.toList()); 
}

另外,我需要将BigDecimal列表传递给此方法,但是只想将其保留为通用列表,以便我可以在其他场景中重用此方法。

List<BigDecimal> l = new ArrayList<>();
l.add(new BigDecimal(1));
l.add(new BigDecimal(2));
l.add(new BigDecimal(3));
l.add(new BigDecimal(4));
l.add(new BigDecimal(5));
l.add(new BigDecimal(6));
l.add(new BigDecimal(7));
List<List<BigDecimal>> findPattern = splitLists(l,5);

1 个答案:

答案 0 :(得分:1)

在答案出现后改变问题是一个坏习惯。但是,BigDecimal,我们在这里:

import java.math.BigDecimal

List<BigDecimal> l = new ArrayList<>();
l.add(new BigDecimal(1));
l.add(new BigDecimal(2));
l.add(new BigDecimal(3));
l.add(new BigDecimal(4));
l.add(new BigDecimal(5));
l.add(new BigDecimal(6));
l.add(new BigDecimal(7));

List<List<BigDecimal>> findPattern = splitLists(l, 5, new BigDecimal (0));

我们计算长度不匹配并添加中性元素。当然我们需要得到一个T型:

    int mismatch = len - (alist.size () % len);
    for (int i = 0; i < mismatch; ++i) 
         alist.add (neutral);


public static <T> List<List<T>> splitLists (final List<T> alist, final int len, T neutral) {
    int mismatch = len - (alist.size () % len);
    for (int i = 0; i < mismatch; ++i) alist.add (neutral) ;
    return IntStream.range(0, alist.size()) 
            .filter(i -> i % len == 0) 
            .boxed() 
            .map(i -> alist.subList(i, Math.min(i + len, alist.size()))) 
            .collect(Collectors.toList()); 
}

调用该列表需要一个参数,即中性元素:

-> List<List<BigDecimal>> findPattern = splitLists(l, 5, new BigDecimal (0));
|  Modified variable findPattern of type List<List<BigDecimal>> with initial value [[1, 2, 3, 4, 5], [6, 7, 0, 0, 0]]
|    Update overwrote variable findPattern

(如果你对奇怪的输出有疑问的话,请在jshell中进行测试。)

如果您不需要更改旧列表,请传递副本或在方法中创建副本以进行处理。