Стрим в LinkedHashSet

Я хочу сохранить .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 ).

Thomas 21.08.2018 10:52

Похоже, вы ищете упорядоченную структуру List, а не Set, которой нет;

Dragonthoughts 21.08.2018 10:54

из javadoc Это неупорядоченный коллекторdocs.oracle.com/javase/8/docs/api/java/util/stream/…

Jens 21.08.2018 10:54
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
22
3
12 272
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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 и итератора здесь нормально, ему просто нужно использовать правильную реализацию.

Thomas 21.08.2018 10:55

@ Томас, ты прав, это решает проблему иначе, чем попросил OP

WhiteMaple 21.08.2018 10:57
Ответ принят как подходящий

Вы просто не знаете конкретный тип, созданный этим фабричным методом (гарантии должен возвращать Задавать, ничего больше).

Единственный надежный способ - это фактически контроль, что происходит, завершив операцию потока с помощью

... 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.

Другие вопросы по теме