首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用java 8压缩多个列表?

如何使用java 8压缩多个列表?
EN

Stack Overflow用户
提问于 2017-06-20 20:43:39
回答 4查看 3.6K关注 0票数 7

给定:

代码语言:javascript
复制
List<Integer> a = Arrays.asList(1,2,3);
List<Integer> b = Arrays.asList(1,2,3);
List<Integer> c = Arrays.asList(1,2,3);
List<Integer> d = Arrays.asList(1,2,3);

List<List<Integer>> sample = Arrays.asList(a,b,c,d);

怎样才能在java 8中得到这样的结果呢?

代码语言:javascript
复制
[(1,1,1,1),(2,2,2,2),(3,3,3,3)]
EN

回答 4

Stack Overflow用户

发布于 2017-06-21 00:04:53

代码语言:javascript
复制
/**
 * Zips lists. E.g. given [[1,2,3],[4,5,6]], returns [[1,4],[2,5],[3,6]].
 * @param listOfLists an N x M list
 * @returns an M x N list
 */
static <T> List<List<T>> zip(List<List<T>> listOfLists) {
    int size = listOfLists.get(0).size();
    List<List<T>> result = new ArrayList<>(size);
    for (int i = 0; i < size; ++i)
        result.add(
                listOfLists.stream()
                        .map(list -> list.get(i))
                        .collect(toList()));
    return result;
}
票数 5
EN

Stack Overflow用户

发布于 2017-06-20 21:18:59

Java streams本身并不支持压缩。

如果你想手动完成,那么使用IntStream作为列表的‘迭代器’是可行的:

代码语言:javascript
复制
    List<Integer> l1 = Arrays.asList(1, 2, 3);
    List<Integer> l2 = Arrays.asList(2, 3, 4);

    List<Object[]> zipped = IntStream.range(0, 3).mapToObj(i -> new Object[]{l1.get(i), l2.get(i)}).collect(Collectors.toList());

    zipped.stream().forEach(i -> System.out.println(i[0] + " " + i[1]));

然而,这是丑陋的,而且不是“java”的方式(就像使用一个“properties”数组而不是一个类)。

票数 2
EN

Stack Overflow用户

发布于 2017-06-20 21:00:43

如果我们认为所有的列表都有相同的大小,那么为什么是Java 8呢?你可以像这样使用一个简单的循环:

代码语言:javascript
复制
List<List<Integer>> list = new ArrayList<>();
for(int i = 0; i<a.size(); i++){
    list.add(Arrays.asList(a.get(i), b.get(i), c.get(i), d.get(i)));
}

输出

代码语言:javascript
复制
[[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3]]

我真的坚持要在这里读这篇文章

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44653421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档