Упростить подсчет с помощью двух циклов for (используя поток) - PullRequest
0 голосов
/ 09 октября 2018

У меня есть этот код, и я хочу написать его с использованием потоков.Мне нужно проверить, содержит ли hList все элементы dFoods.

int count = 0;
for(int i = 0; i< dFoods.size(); i++){
    for(int j = 0; j< hList.size(); j++){
        if(hList.get(j).title.equals(dFoods.get(i).name) && hList.get(j).time.equals(dFoods.get(i).timestamp)){
            count ++;
        }
    }
}
if(count != dFoods.Elements.size()){
    System.out.println("Not all dFoods elements are in a hList");
}

Я пробовал

dFoods.forEach(df -> {
        hList.stream().filter(hl -> df.Name.equals(hl.title) && df.Timestamp.equals(hl.time)).forEach(hl -> {
            System.out.println(df.Name + " " + df.Timestamp);
        });
    });

И он пишет правильно, но мне нужно сосчитать, а это нельзясделано таким образом.

Ответы [ 4 ]

0 голосов
/ 09 октября 2018

Решение greg, предоставляющего логическое состояние, может показаться наилучшим, если этого достаточно.

int count = (int) dFoods.stream()
    .mapToLong(
        f -> hList.stream()
            .filter(h -> h.title.equals(f.name) && h.time.equals(f.timestamp))
            .count())
    .sum();

Где hList должно быть неявно окончательным.

0 голосов
/ 09 октября 2018
dFoods.forEach(df -> {
        hList.stream().filter(hl -> df.Name.equals(hl.title) && df.Timestamp.equals(hl.time)).count();
    });

Ура!

0 голосов
/ 09 октября 2018

Сначала найдите количество сходств между dFoods и hList.

Long countOfMatching = dFoods.stream()
        .filter(df ->
                hList.stream()
                        .anyMatch(hl -> df.Name.equals(hl.title) && df.Timestamp.equals(hl.time)))
        .count();

Внутренний поток возвращает true, если элемент dFood находится в hList.И фильтрация, если вернуть true во внешний поток для сбора.Теперь вы можете получить счетчик сходства между двумя списками.Теперь примените, если размер списка совпадения двух списков с этим найденным значением.Если вам нужен только логический результат if all, сделайте это так:

Boolean allMatched = dFoods.stream()
        .allMatch(df ->
                hList.stream()
                        .anyMatch(hl -> df.Name.equals(hl.title) && df.Timestamp.equals(hl.time)));
0 голосов
/ 09 октября 2018
dFoods.stream()
  .allMatch(df -> 
      hList.stream
        .anyMatch(hl -> df.Name.equals(hl.title) && df.Timestamp.equals(hl.time)))
...