我想以自然顺序将.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?
答案 0 :(得分:5)
您只是不知道该工厂方法创建的特定类型(guarantees返回 Set ,仅此而已)。
唯一可靠的方法是通过结束流操作
来实际控制... collect( Collectors.toCollection( LinkedHashSet::new ) );
答案 1 :(得分:1)
返回此集合中元素的迭代器。元素以不特定的顺序返回(除非此集合是提供保证的某些类的实例)。
请参见https://docs.oracle.com/javase/7/docs/api/java/util/Set.html#iterator()
使用List
而不是Set
。
答案 2 :(得分:1)
.collect(Collectors.toSet())
不会创建LinkedHashSet
,而是常规的HashSet
。
而是使用.collect(Collectors.toCollection(LinkedHashSet::new)
来确保正在使用LinkedHashSet
。
答案 3 :(得分:0)
一个集合通常是无序的,但是有一个排序的集合在存储过程中效率不高,但是仅保留次序和唯一元素
检查是否可以使用此命令:http://www.java2s.com/Tutorials/Java/Java_Collection/0110__Java_Sorted_Set.htm