【问题标题】:Stream distinct Array elements in List在 List 中流式传输不同的 Array 元素
【发布时间】:2019-08-25 09:14:10
【问题描述】:

我有一个 ListString[6]s。我正在尝试构建一个 List<List>,它在每个索引处包含唯一的 String 元素。

由于某种原因,我经常遇到这个问题,搜索看看是否存在答案,进行了大量实验,最终构建了一个不使用流但占用大约 20 行代码的工作方法。

为了澄清,举个例子:

//Sample items: String[] items = "AD", "AR", "BC", "DA", "RA", "DD";
//              String[] items2 = "AE", "AZ", "BU", "DI", "RE", "DP";
//              String[] items3 = "AD", "AO", "BU", "DZ", "RW", "DP";
List<String[]> itemsList;
List<String>[] distinctItems;

如果 itemsList 包含示例 Items,.stream() 如何将它们放入 distinctItems 中? distinctItems 应如下所示:

//distinctItems[0].get(0) == "AD"
//distinctItems[0].get(1) == "AE"
//distinctItems[0].size() == 2         ; Has 2 unique elements in index 0

//distinctItems[1].get(0) == "AR"
//distinctItems[1].get(1) == "AZ"
//distinctItems[1].get(2) == "AO"
//distinctItems[1].size() == 3         ; Has 3 unique elements in index 1

我在 .stream() 方面做得很好,但在某些复合数据类型(数组列表 [])上,我似乎找不到正确的方法和解决方案。

非常感谢任何帮助。

【问题讨论】:

  • 不清楚! List&lt;String[]&gt; 基本上是一个二维数据结构。 List&lt;List&gt;[] 是一个三维数据结构。我不知道你想如何转换你的源列表。除此之外,您的代码尝试在哪里?
  • 啊,我想我复制错了:List[]。我有没有流的工作解决方案,但我认为 stream() 会更简洁。我整个晚上都在做一个项目,所以我已经筋疲力尽了。如果你认为这个问题是无效的,我就把它记下来。使用 .stream() 的尝试包括 .foreach()、.distinct(),但我不确定如何将 .distinct() 应用于原始列表中的 String[]。

标签: java arrays list java-stream distinct-values


【解决方案1】:

如果我理解正确,您实际上想要一个List&lt;List&lt;String&gt;&gt;,它与您的 3 个List&lt;String[]&gt; 大小相同,并且包含每个索引;该索引的不同元素。

所以

    List<String[]> itemLists = new ArrayList<>();
    itemLists.add(new String[] { "AD", "AR", "BC", "DA", "RA", "DD" });
    itemLists.add(new String[] { "AE", "AZ", "BU", "DI", "RE", "DP" });
    itemLists.add(new String[] { "AD", "AO", "BU", "DZ", "RW", "DP" });

    List<List<String>> distinctItems =
        IntStream.range(0, itemLists.get(0).length)
                 .mapToObj(i -> itemLists.stream().map(itemArray -> itemArray[i]).distinct().collect(toList()))
                 .collect(toList());

    System.out.println("distinctItems = " + distinctItems);

【讨论】:

  • 我想是的,是的,您描述的 List> 就可以了。这里有很多内容,很快将更详细地研究流中的这些 .mapToObj()、.range() 方法和 stream()ing。这打开了一些非常令人兴奋的大门!我得到了这个,“无法推断 mapToObj(intFunction extends U>) 的类型参数。也许我需要一个额外的括号?在这里快速回答,你似乎非常擅长 stream()!会接受一旦我确定我理解了这一点。
猜你喜欢
  • 2013-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-11
相关资源
最近更新 更多