【问题标题】:Stream to LinkedHashSet [duplicate]流到 LinkedHashSet [重复]
【发布时间】:2019-01-27 10:08:03
【问题描述】:

我想以自然顺序将 .csv 保存到 LinkedHashSet,因此 .csv 的第一行应该是 LinkedHashSet 的第一个元素。

文件如下所示:

java  
c  
c++  
assembly language  
swift  

我的代码是这样的:

public class test {   
    public static void main(String[] args) throws IOException {         
         final Charset ENCODING = Charset.forName("Cp1250");
         Path fileToLoad = Paths.get("src/main/resources/test.csv");
         Set<String> x = Files.lines(fileToLoad, ENCODING)
                 .map(Function.identity())
                 .collect(Collectors.toSet());

         Iterator<String> it = x.iterator();
         while(it.hasNext()) {
             System.out.println(it.next());
         }
    }
}

但它返回错误的顺序:

assembly language
c++
java
c
swift

我认为该流只是将其保存为 HashSet。

是否可以将其保存为带流的 LinkedHashSet?

【问题讨论】:

  • 那是因为Collectors.toSet() 不会使用LinkedHashSet,而只会使用HashSet。请改用Collectors.toCollection( LinkedHashSet::new )
  • 您似乎在寻找有序的List 结构,而不是非有序的Set
  • 来自 javadoc 这是一个无序收集器 docs.oracle.com/javase/8/docs/api/java/util/stream/…

标签: java java-8 java-stream


【解决方案1】:

您根本不知道该工厂方法创建的特定类型(guarantees 返回 Set,仅此而已)。

唯一可靠的方法是真正控制发生的事情,通过结束流操作

... collect( Collectors.toCollection( LinkedHashSet::new ) );

【讨论】:

  • 天哪,我很愚蠢。谢谢你。 ?
  • @mondjunge 当然不是。这似乎很明显,但我确实记得当时我第一次阅读这个问题时偶然发现了这个问题。
【解决方案2】:

.collect(Collectors.toSet()) 不会创建 LinkedHashSet,而是创建常规的 HashSet。 而是使用.collect(Collectors.toCollection(LinkedHashSet::new) 来确保使用LinkedHashSet

【讨论】:

    【解决方案3】:

    一个集合通常是无序的,但有一个有序集合在存储过程中效率不高,但只保留顺序和唯一元素

    检查你是否可以使用这个:http://www.java2s.com/Tutorials/Java/Java_Collection/0110__Java_Sorted_Set.htm

    【讨论】:

      【解决方案4】:

      返回此集合中元素的迭代器。返回的元素没有特定的顺序(除非这个集合是某个提供保证的类的实例)。

      https://docs.oracle.com/javase/7/docs/api/java/util/Set.html#iterator()

      使用List 而不是Set

      【讨论】:

      • 请注意,OP 声明他想使用LinkedHashSet,它将按插入顺序迭代元素。所以在这里使用 set 和 iterator 没问题,他只需要使用正确的实现即可。
      • @Thomas 你说得对,这解决问题的方式与 OP 要求的不同
      猜你喜欢
      • 2013-08-30
      • 2014-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多