Как напечатать java Набор Наборов элементов в отсортированном порядке? - PullRequest
0 голосов
/ 04 марта 2020

В моей программе есть HashSet<HashSet<Integer>>, в конце своей программы я печатаю содержимое, используя следующее утверждение:

System.out.println("Groups: " + allSets.toString());

Это показывает мне это,

Groups: [[17], [19], [2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21], [11], [13]]

Мой ответ хорошо , но я хотел бы видеть его в отсортированном как,

Groups: [[2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21], [11], [13], [17], [19]]

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

Я пытался с TreeSet, но это не работает, (got some exceptions).

Я решил моя проблема с использованием List вместо Set,

Мне интересно, есть ли способ получить такой же упорядоченный вывод, используя Set?

Ответы [ 4 ]

6 голосов
/ 04 марта 2020

Вы можете использовать TreeSet для внешнего набора, вам просто нужно дать ему действительный компаратор. Я бы порекомендовал что-то вроде

SortedSet<SortedSet<Integer>> outerSet = new TreeSet<SortedSet<Integer>>(
  Comparator.comparingInt(SortedSet::first));

(при условии Java 8).

1 голос
/ 05 марта 2020

К сожалению, я не могу комментировать ответ. Но принятый ответ не мог быть точным. Вы должны быть очень осторожны с компараторами при использовании Tree в java. Как только ваш компаратор вернет 0, предполагается, что объекты равны, поэтому не будут добавлены в дерево.

Если в ваших наборах ожидаются все уникальные числа, просто проигнорируйте этот ответ!

Иное: предложенный компаратор Луи Вассерман сравнивает только по первому элементу ! Так что в случае, если попробуйте следующий код, чтобы проверить это:

        SortedSet<Integer> s1 = new TreeSet<>(Arrays.asList(13, 14, 15, 16, 17));
        SortedSet<Integer> s2 = new TreeSet<>(Arrays.asList(13, 19));
        SortedSet<Integer> s3 = new TreeSet<>(Arrays.asList(13, 133));
        SortedSet<Integer> s4 = new TreeSet<>(Arrays.asList(110, 13));
        SortedSet<Integer> s5 = new TreeSet<>(Collections.singletonList(13));
        SortedSet<Integer> s6 = new TreeSet<>(Arrays.asList(13,16));
        SortedSet<Integer> s7 = new TreeSet<>(Arrays.asList(13,17));
        SortedSet<SortedSet<Integer>> s = new TreeSet<SortedSet<Integer>>(
                Comparator.comparingInt(SortedSet::first));
        s.addAll(Arrays.asList(s1, s2, s3, s4, s5, s6, s7));
        System.out.println(s);

Это будет:

[[13, 14, 15, 16, 17]]

Это то, что вы ожидаете?

http://tpcg.io/HQONOhVV

Если вы хотите go с TreeSet, вам нужен более строгий компаратор, например: (сравнивает по размеру по убыванию, тогда одинаковые размеры сравниваются по элементам один за другим)

new TreeSet<>(((Comparator<Set<Integer>>) (o1, o2) -> o2.size() - o1.size()).thenComparing((o1, o2) -> {
                Iterator<Integer> i1 = o1.iterator();
                Iterator<Integer> i2 = o2.iterator();
                while (i1.hasNext() && i2.hasNext()) {
                    Integer n1 = i1.next();
                    Integer n2 = i2.next();
                    if (!n1.equals(n2)) {
                        return n1 - n2;
                    }
                }
                return 0;
            }));

Возможно, вы захотите изменить порядок сравнения (по размеру после по пунктам.

http://tpcg.io/1FjcQ2XA

1 голос
/ 05 марта 2020
     HashSet<HashSet<Integer>> allSets = new HashSet<>();
     List<Set<Integer>> out=allSets.stream().
                            sorted((x, y) -> x.iterator().next() - y.iterator().next()).
                            collect(Collectors.toList());
0 голосов
/ 04 марта 2020

Я работаю с предположением, что вы помещаете «значения» в набор в отсортированном порядке, сам HashSet не сохраняет порядок вставки, но вы можете использовать LinkedHashSet , из do c:

Эта реализация отличается от HashSet тем, что поддерживает двусвязный список, проходящий через все его записи. Этот связанный список определяет порядок итераций, то есть порядок, в котором элементы были вставлены в набор (порядок вставки). "

Вы можете использовать это поведение во время печати. ​​

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