java - 对列表中的对象进行分组 java 8

标签 java lambda java-8

我有一个类似的列表:lst = {"a","b","c","b","c","a","c","a","b"}

我想把它分成几 block :

像第一个 block :a,b,c 第二个是:b,c,a 第三个是:c,a,b

请注意,这些 block 可以按任何顺序排列,并且不是简单的 String 对象,而是可以是任何东西(即:复杂对象、Map 等)。

此外,我不能盲目地分成 block ,因为每个 block 中的数据应该相同且相关数据即:在第一个 block 中 a、b、c 是相互关联的。同样在第二 block 中 b、c、a 是相互关联的,所以上。

我怎样才能做到这一点。

我想到的一种可能的方法是在 Java8 中使用收集器和组。

任何建议。

PS:请忽略语法,这只是为了理解目的。

注意:此处标记为重复的答案不适用。

最佳答案

如果没有一些中间映射对象,我认为不可能做到这一点。为了尝试一下,我想出了以下解决方案:

public class Try30 {
    public static class StringIntPair {
        public final int i;
        public final String s;
        public StringIntPair(int i, String s) {
            this.i = i;
            this.s = s;
        }
    }

    public static void main(String[] args) {
        List<String> in = Arrays.asList("a","b","c","b","c","a","c","a","b");
        AtomicInteger cnt = new AtomicInteger(0);
        Map<Integer, List<String>> res = in.stream()
            .map(s -> new StringIntPair(cnt.getAndIncrement(), s))
            .collect(Collectors.groupingBy(
                p -> p.i / 3,
                Collectors.mapping(p -> p.s, Collectors.toList())
                ));
        System.out.println(res);
    }
}

但是,在现实生活中,我宁愿采用经典的循环方法,因为这看起来非常复杂且极难理解。请不要忘记,即使在 Java 8 中,for 循环和 while 循环仍然是受支持且有值(value)的语言功能。

关于java - 对列表中的对象进行分组 java 8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39219511/

相关文章:

java - 无法使用 Flink Table API 打印 CSV 文件

java - 使用鼠标移动 shell 并调整其大小(自定义标题栏)

java - 从 lambda 对象获取 MethodHandle

android - Android Lambda 的 NoSuchMethodError

java - Apache POI - 如何使用选项保护工作表?

python - 作为字典中的值的列表的交集

java - 在编码之前动态隐藏一些字段(java 到 json)

java - 使用 java 8 在文件名和扩展名之间添加中缀

java - 通过过滤器查找项目或获取任何

java - 比较二维数组与 JTextField