Сложная группировка Java-потоковПоJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Сложная группировка Java-потоковПо

Сообщение Anonymous »

Я пытаюсь использовать потоки Java для достижения той же логики, что и ниже. По сути, я пытаюсь выяснить, есть ли в коллекции две записи с одинаковым идентификатором журнала и тегом более одного раза
class Log {
private String id;
private List tags;
};

void findLogsWithSameTag(List logs) {

final Map map = new HashMap();

for ( var log : logs ) {
for ( var tag : log.getTags() ) {
Integer count = map.computeIfAbsent( log.getId(), key -> new HashMap())
.getOrDefault( tag, 0);
map.get( log.getId() ).put( tag, count + 1 );
}
}

for ( final var entry : map.entrySet() ) {
for ( final var entry2 : entry.getValue().entrySet() ) {
if ( entry2.getValue() > 1 ) {
throw new IllegalArgumentException("bad!");
}
}
}
}


Сначала я попытался сгруппировать журналы по тегам, но не знаю, как с помощью FlatMap сделать ключ строкой вместо Список. Затем я попытался сгруппировать по Log::getId, но мне снова не удалось сопоставить теги со строкой.
Кто-нибудь знает, как это сделать с помощьюstream().groupingBy(...)?
edit: добавление нескольких примеров:
// should throw as log1 has tag1 twice
List.of(
new Log("log1", List.of( "tag1", "tag2") )
new Log("log1", List.of( "tag1") )
);

// should not throw as there is no tag more than once associated with an id
List.of(
new Log("log1", List.of( "tag1", "tag2") )
new Log("log2", List.of( "tag1") )
);


Подробнее здесь: https://stackoverflow.com/questions/783 ... groupingby
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»