Я хочу сохранить .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 с потоком?
Похоже, вы ищете упорядоченную структуру List, а не Set, которой нет;
из javadoc Это неупорядоченный коллекторdocs.oracle.com/javase/8/docs/api/java/util/stream/…




Returns an iterator over the elements in this set. The elements are returned in no particular order (unless this set is an instance of some class that provides a guarantee).
См. https://docs.oracle.com/javase/7/docs/api/java/util/Set.html#iterator ()
Используйте List, а не Set.
Обратите внимание, что OP заявил, что хочет использовать LinkedHashSet, который будет перебирать элементы в порядке вставки. Так что использование set и итератора здесь нормально, ему просто нужно использовать правильную реализацию.
@ Томас, ты прав, это решает проблему иначе, чем попросил OP
Вы просто не знаете конкретный тип, созданный этим фабричным методом (гарантии должен возвращать Задавать, ничего больше).
Единственный надежный способ - это фактически контроль, что происходит, завершив операцию потока с помощью
... collect( Collectors.toCollection( LinkedHashSet::new ) );
Набор обычно неупорядочен, но есть упорядоченный набор, который не так эффективен в процессе хранения, но сохраняет только порядок и уникальные элементы.
Проверьте, можете ли вы использовать это: http://www.java2s.com/Tutorials/Java/Java_Collection/0110__Java_Sorted_Set.htm
.collect(Collectors.toSet()) создает не LinkedHashSet, а обычный HashSet.
Лучше используйте .collect(Collectors.toCollection(LinkedHashSet::new), чтобы убедиться, что используется LinkedHashSet.
Это потому, что
Collectors.toSet()не будет использоватьLinkedHashSet, а будет использовать толькоHashSet. Вместо этого попробуйтеCollectors.toCollection( LinkedHashSet::new ).