Как перебрать 2D LinkedHashSet и распечатать его содержимое?

Я использую 2D LinkedHashSet для своей программы. Мне было интересно, как я могу перебирать двумерный HashSet и печатать его содержимое, не делая этого:

System.out.println(имя инициализированного HashSet)

Вот мой код для инициализации 2D LinkedHashSet:

LinkedHashSet<LinkedHashSet<String>> block = new LinkedHashSet<LinkedHashSet<String>>();

person LavaMaster    schedule 26.12.2019    source источник
comment
System.out.println(name of initialized HashSet) – Что не так с этой строкой?   -  person Turing85    schedule 27.12.2019
comment
Я не хочу просто печатать 2D LinkedHashSet. Я хотел бы перебрать каждый элемент в 2D LinkedHashSet и распечатать каждое отдельное значение. Подобно тому, как вы можете перебирать 2D-массив с циклом n ^ 2. Я хочу научиться перебирать 2D LinkedHashSet.   -  person LavaMaster    schedule 27.12.2019


Ответы (2)


Для этого вы можете использовать 2 цикла, как для массива:

for (Set<String> innerSet : block) {
    for (String string : innerSet) {
        System.out.println(string);
    }
}

Вы также можете использовать потоки для печати каждого элемента:

block.stream()
        .flatMap(Collection::stream)
        .forEach(System.out::println);
person Matt Berteaux    schedule 26.12.2019
comment
У меня есть быстрый вопрос по этому поводу. Можно ли редактировать значения в LinkedHashSet после их добавления? - person LavaMaster; 27.12.2019
comment
@LavaMaster Вам придется удалить значение и добавить новое значение. Однако вы не можете сделать это в цикле for, иначе вы получите ConcurrentModificationException. Вы можете использовать потоки для изменения значений. Но это немного более продвинуто. - person Matt Berteaux; 27.12.2019
comment
хорошо, это имеет смысл. По сути, я пытаюсь проверить, содержит ли 2D LinkedHashSet определенную строку. Если String уже содержится в 2D LinkedHashSet, то я хочу найти ее местоположение в 2D LinkedHashSet и добавить туда другое значение. - person LavaMaster; 27.12.2019

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

демонстрация Ideone

import java.util.LinkedHashSet;

public class Streamify {
    public static void main (final String... args) {
        final LinkedHashSet<LinkedHashSet<String>> block = new LinkedHashSet<>();
        final LinkedHashSet<String> lineOne = new LinkedHashSet<>();
        lineOne.add("Hello");
        lineOne.add("World");
        block.add(lineOne);
        final LinkedHashSet<String> lineTwo = new LinkedHashSet<>();
        lineTwo.add("Hi");
        lineTwo.add("Universe");
        block.add(lineTwo);

        block.forEach(line -> {
            line.forEach(System.out::print);
            System.out.println();
        });
    }
}
person Turing85    schedule 27.12.2019
comment
Хотя это функциональный способ добиться этого, технически это не потоковое решение. .forEach является методом по умолчанию в интерфейсе Iterable и отличается от .forEach в Stream. - person Matt Berteaux; 27.12.2019
comment
Правда что. Исправлено. - person Turing85; 27.12.2019