Из списка набора строк в простой список - PullRequest
1 голос
/ 02 апреля 2019

Есть ли способ преобразовать List<Set<String>> mainList в простой список, без перебора элементов?

Например, этот имеет значение:

mainList = {ArrayList@705}  size = 2
 0 = {HashSet@708}  size = 3
  0 = "A2"
  1 = "A1"
  2 = "A3"
 1 = {HashSet@709}  size = 3
  0 = "A6"
  1 = "A5"
  2 = "A7"

Я хотел бы получить новый список, например:

list = A2,A1,A3, A6, A5, A7

Ответы [ 3 ]

3 голосов
/ 02 апреля 2019

Если вы используете Java версии 1.8 и выше, то вы можете использовать потоки, но он все равно будет использовать внутренний итератор.Вот пример:

List<String> list = mainList.stream() // create stream
    .flatMap(Set::stream)             // convert Set<String> to Stream
    .collect(Collectors.toList());    // collect to new ArrayList
2 голосов
/ 02 апреля 2019

Если вас интересует только использование итератора, вы можете использовать простой для каждого цикла, чтобы решить задачу

    List<Set<String>> hs = null ; // Actual given List<Set<String>
    ArrayList<String> arrayList = new ArrayList<String>(); // Plain List that will contain all the strings
    for(Set<String> set :hs) {
        arrayList.addAll(new ArrayList<String>(set)); // adding all the elements in list from hashset
    }

и с использованием потоков (Java 1.8 и выше) таким образом

    List<Set<String>> list = null ;
    List<String> al =  hs.stream().flatMap(Set::stream).collect(Collectors.toList());

но не могли бы вы объяснить, почему вы не хотите использовать итераторы?

0 голосов
/ 02 апреля 2019

Вы не можете.Обычно, единственный способ скопировать n вещи - это итерация по каждому из них.

Единственный способ избежать итерации по элементам - это операция более низкого уровня, например, копирование массива.

1006 * будет делать это (другие, как LinkedList, не будут), но ни одна реализация Set в JDK не обеспечивает свою собственную реализацию toArray.Все они используют AbstractCollection.toArray, который выполняет внутреннюю итерацию по всем элементам.

Если вы реализовали или нашли реализацию Set на основе массива (которая, однако, почти наверняка не была бы оптимальной Set), то вы могли бы сгладить ArrayList<ArraySet<String>>, используя серию копий массива безперебирая элементы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...