我有一个列表:lst = {"a","b","c","b","c","a","c","a","b"}
我想把它分成几块:
像第一个块一样:a,b,c 第二个是:b,c,a 第三是:c,a,b请注意这些块可以是任何顺序,不是简单的String对象,但可以是任何东西(Viz:Complex对象,Map等)。
此外,我不能盲目地分成块,因为每个块中的数据应该是相同的并且它是相关的数据,即:在第一个块a,b,c中是相互关联的。在第二个块b中,c,a是相互关联的,因此上。
我该怎么做。
我想到的一种可能方式是在Java8中使用收集器和组。
任何建议。
PS:请忽略语法,这只是为了理解目的。
注意:此处标记为重复的答案不适用。
答案 0 :(得分:1)
如果没有一些中间映射对象,我没有看到这样做的可能性。只是尝试一下,我提出了以下解决方案:
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循环中,它仍然是支持且有价值的语言功能。