Java8流可以处理越来越多的元素吗?

Java8流可以处理越来越多的元素吗?,java,java-stream,Java,Java Stream,我做了一个编程练习来寻找回文组合。例如,列表中有哪些回文 [ "abc", "def", "zzb", "cba", "yes", "fed" ] 答案是 ["abc", "cba"], ["cba", "abc"], ["def", "fed"], ["fed", "def"], ["abc", "def", "fed", "cba"] 等等。这个数据集大概有八个 我注意到要查询的组合数大致取决于N!,这意味着一个小到十个元素的列表意味着搜索三百多万个组合 为了节省内存,我编写了一些函数,

我做了一个编程练习来寻找回文组合。例如,列表中有哪些回文

[ "abc", "def", "zzb", "cba", "yes", "fed" ]
答案是

["abc", "cba"], ["cba", "abc"], ["def", "fed"], ["fed", "def"], ["abc", "def", "fed", "cba"]
等等。这个数据集大概有八个

我注意到要查询的组合数大致取决于N!,这意味着一个小到十个元素的列表意味着搜索三百多万个组合

为了节省内存,我编写了一些函数,这些函数接受初始列表并创建了置换,但每个发现的置换都会立即被完全处理。在任何时候,记忆中都没有完整的膨胀列表

我没有使用Java8流,因为我假设我无法添加到流源(在本例中为六个元素),并且系统会在内部将排列缓冲到其最大列表大小,这将导致内存溢出

这个练习是否有Java的流解决方案?我知道如何创建回文。我寻求的是如何指定一个小列表,排列它的所有组合,并且永远不要使用超过一点的内存来获得最终结果

谢谢,
Jerome.

您想使用java.util.stream.stream的这个静态方法:

静态流生成(供应商)
返回无限顺序无序流,其中每个元素由提供的供应商生成

您需要一个类,该类为每次调用
get()
返回一个新的组合。编写类似Python的
yield
:)

的代码可能是一个挑战。您可以在字符串列表上进行流式处理,并使用
flatMap
将单个字符串映射到所有排列的(子)流,有效地在所有字符串的所有排列上进行流式处理,而不必同时在内存中存储所有字符串,然而,这仍然意味着要处理所有可能的排列。如果您的目标只是测试这些排列是否在列表中,那么只需检查按规范排列对字符串进行分组,就可以做得更简单

List<String> list = Arrays.asList("abc", "def", "zzb", "cba", "yes", "fed");
list.stream()
    .collect(Collectors.groupingBy(s -> {
        char[] array = s.toCharArray();
        Arrays.sort(array);
        return CharBuffer.wrap(array);
    }))
    .values().stream()
    .filter(group -> group.size()>1)
    .forEach(System.out::println);
列表中包含哪些回文


构建组的排列,如打印
[abc,cba]
[cba,abc]
并不能真正提高答案的质量,但是,您也可以这样做,而无需构建和检查所有可能的回文…

也许您可以从一些事情开始,展示您在Java 8 stream/lambda之前的实现版本,如果遇到问题,请征求建议。挑战的实际目标是什么?找到可能组合的总数?你可以在不计算组合的情况下做到这一点。为什么你的单子有五个不同的答案?或者这个答案是什么意思?
List<String> list = Arrays.asList("abc", "def", "zzb", "cba", "yes", "fed");
list.stream()
    .collect(Collectors.groupingBy(s -> {
        char[] array = s.toCharArray();
        Arrays.sort(array);
        return CharBuffer.wrap(array);
    }))
    .values().stream()
    .filter(group -> group.size()>1)
    .forEach(System.out::println);