首页 > 解决方案 > 我怎样才能避免内循环

问题描述

如何避免内部循环并仅使用流功能编写此“分配”? 编辑:我想要一个链接在一起的所有唯一对的列表,存储在l2. 示例:输入:String[] l = { "a", "a", "b", "c", "d", "d", "d", "d", "a", "a", "b", "b", "c", "d" };,输出:[a, a, b, c, d, d, b, b, c, d]

String[] l = { "a", "a", "b", "c", "d", "d", "d", "d", "a", "a" };
String[] l2 = 
        IntStream.iterate(0, i -> i < l.length, i -> i + 2)
        .mapToObj(i -> Objects.hash(l[i], l[i + 1]))
        .distinct()
        .map(h -> {
            for (int j = 0; j < l.length; j += 2) {
                if (h == Objects.hash(l[j], l[j + 1])) {
                    return new String[] { l[j], l[j + 1] };
                }
            }
            return null;
        })
        .flatMap(Arrays::stream)
        .toArray(String[]::new);
System.out.println(Arrays.toString(l2));

标签: javajava-stream

解决方案


我不完全确定您的循环试图实现什么。Jason 的循环查找所有唯一字符,但看起来您正在寻找所有唯一字符串对,然后将其展平。您使用“Objects.hash()”来消除重复对是不正确的,两对可能不同但具有相同的哈希,所以杰森摆脱它是正确的。如果你真的想要一个连接在一起的唯一对列表,这可能会起作用:

IntStream.range(0, l.length / 2)
  .mapToObj(i -> List.of(l[i * 2], l[i * 2 + 1]))
  .distinct()
  .flatMap(List::stream)
  .toArray(String[]::new);

推荐阅读