Итак, у меня есть набор с именем «все», содержащий объекты Doc. Затем у меня есть еще один набор под названием «partDocs», который содержит другие наборы, содержащие документ. Допустим, что "all" содержит = [Doc1, Doc2, Doc3]. Я хочу, чтобы partDocs содержал такие наборы, как: [[Doc1], [Doc2], [Doc3]]. Как я могу это сделать?

Я старался

Set<Doc> all = new HashSet<Doc>(); // contains [Doc1, Doc2, Doc3]
Set<Set<Doc>> partDocs = new HashSet<Set<Doc>>();
Set<Doc> set2 = new HashSet<Doc>();

for (i = 0; i < all.size(); i++) {
   set2.clear();
   set2.add(all.stream().toList().get(i)); // adds the i.th element of the all set
   partDocs.add(set2);
}

Однако, когда я это делаю, partDocs имеет только последний элемент всего набора, потому что set2 всегда меняется, а его последнее значение - [Doc3]

Я также пробовал сделать ниже, но его синтаксис неверен

for (i = 0; i < all.size(); i++) {
   partDocs.add(Set<allDocuments.stream().toList().get(i)>);
}

Кто-нибудь знает, как это реализовать?

0
turbagu 11 Окт 2021 в 10:17

3 ответа

Лучший ответ

Я не знаю, действительно ли вы хотите это сделать. Код кажется очень запутанным, но попробуйте следующее:

Set<Set<Doc>> partDocs = new HashSet<Set<Doc>>();
Set<Doc> all = new HashSet<>();

for(Doc doc : all) {
    partDocs.add(Set.of(doc));
}

И теперь у вас есть набор (partDocs), содержащий наборы, содержащие документы

0
Kostakiiiis 11 Окт 2021 в 07:37

Признание недействительным set2 ошибочно.

Вместо того

set2.clear();

Должен быть

set2 = new HashSet<Doc>();

Эту конкретную ошибку будет легче понять, если мы воспользуемся списком для partDocs

List<Set<Doc>> partDocs = new ArrayList<Set<Doc>>();

Что приводит к

[[Doc3], [Doc3], [Doc3]]

По сути, мы добавляем один и тот же Set к List, и поскольку мы используем одну и ту же ссылку, последовательные вызовы set2.clear() и set2.add() будут влиять как на локальную переменную, так и на Set в List.

Возвращаясь к partDocs, являющемуся Set, он будет иметь только одну запись, потому что Set гарантирует отсутствие повторяющихся значений, а три идентичных экземпляра, конечно же, являются дубликатами.


Итак, чтобы исправить эту ошибку, мы должны убедиться, что три объекта, добавленные в partDocs, действительно различны, что достигается (частично) с помощью новой процедуры аннулирования.

set2 = new HashSet<Doc>();

А в противном случае тем, что мы каждый раз добавляем к нему новый элемент.

0
Izruo 11 Окт 2021 в 07:38

Повторно объявите set2 в цикле.

        Set<Set<Doc>> partDocs = new HashSet<Set<Doc>>();
        for (int i = 0; i < all.size(); i++) {
            Set<Doc> set2 = new HashSet<Doc>();
            set2.add(all.stream().toList().get(i)); // adds the i.th element of the all set
            partDocs.add(set2);
        }
0
zysaaa 11 Окт 2021 в 07:45