Java-8中生成组合的通用方法
在一次编码考试中,我偶然发现了一个问题,我必须对5个整数的组合执行一些运算 我用动态规划法解决了这个问题,结果很好,被接受了 回到家后,我开始思考是否有任何方法可以使用流生成这些组合 好吧,我想了一会儿,对于2个字符串,我可以使用生成组合 我想知道是否有任何方法可以为Java-8中生成组合的通用方法,java,algorithm,java-8,combinations,Java,Algorithm,Java 8,Combinations,在一次编码考试中,我偶然发现了一个问题,我必须对5个整数的组合执行一些运算 我用动态规划法解决了这个问题,结果很好,被接受了 回到家后,我开始思考是否有任何方法可以使用流生成这些组合 好吧,我想了一会儿,对于2个字符串,我可以使用生成组合 我想知道是否有任何方法可以为 Arrays.asList(“A”、“B”、“C”),数组。asList(“A”、“B”、“C”、“D”、“E”)按 控制时间流将重复的次数 当我为Arrays.asList(“A”、“B”、“C”、“D”、“E”)生成集合{A/
Arrays.asList(“A”、“B”、“C”)代码>,数组。asList(“A”、“B”、“C”、“D”、“E”)代码>按
控制时间流将重复的次数
当我为Arrays.asList(“A”、“B”、“C”、“D”、“E”)生成集合{A/C to mathematics}时代码>
我应该得到[A],[B],[C],[D],[A,B],[A,B,C],[A,B,C],[A,B,C,D]
我想要一种广义的方法,通过这种方法可以得到由一个元素组成的元素集,由两个元素组成的元素集……等等。
__________________________________________________________________________-
除了上面的疑问,我想知道,当用flatmap
内部flatmap
生成集合时,我能够得到AA,BB,AB,BA,虽然它与集合的基本数学定义相矛盾,但在数学中AB或BA只是一个集合。
如何克服这个问题?不要认为把所有东西都塞进流是个好主意。循环和递归没有问题
也就是说,如果你真的想,你可以这样做:
List<String> list = Arrays.asList("A", "B", "C");
List<String> combinations = list.stream()
.reduce(Collections.<String>emptyList(),
(sets, item) -> {
return Stream.of(
sets.stream(),
Stream.of(item),
sets.stream().map(str->str+item)
).flatMap(x->x).collect(Collectors.toList());
},
(sets, sets2) -> {
throw new UnsupportedOperationException(
"Impossible error in sequential streams");
}
);
System.out.println(combinations);
List List=Arrays.asList(“A”、“B”、“C”);
列表组合=List.stream()
.reduce(Collections.emptyList(),
(套,项目)->{
回流(
set.stream(),
(项目)的流量,
set.stream().map(str->str+项)
).flatMap(x->x).collect(collector.toList());
},
(集合,集合2)->{
抛出新的UnsupportedOperationException(
“连续数据流中不可能出现的错误”);
}
);
系统输出打印项次(组合);
你能举例说明你的意思吗?这一部分通过控制时间流的重复次数来实现,我并不清楚。您使用的是List
和String
,它们都没有远程连接到set的数学定义,甚至连Java的set
定义都没有。你可以通过使用合适的工具来解决这个问题。你只做了concat
的二次归约函数与另一个函数的逻辑不匹配。哦,你的意思是我没有写叉积是没有充分理由的。你说得对。我会编辑使它消失。。。
[AA, AB, BA, BB]
List<String> list = Arrays.asList("A", "B", "C");
List<String> combinations = list.stream()
.reduce(Collections.<String>emptyList(),
(sets, item) -> {
return Stream.of(
sets.stream(),
Stream.of(item),
sets.stream().map(str->str+item)
).flatMap(x->x).collect(Collectors.toList());
},
(sets, sets2) -> {
throw new UnsupportedOperationException(
"Impossible error in sequential streams");
}
);
System.out.println(combinations);