Получить сумму элементов ArrayList - PullRequest
0 голосов
/ 28 января 2020

Я пытаюсь получить сумму элементов ArrayList.

Мне удалось напечатать только цифры, но не сумму.

Сейчас он показывает 1,1,1,1,1, что равно 5, и это правильное число. Но я хочу, чтобы вместо него отображалось 5.

ArrayList <history> history = historyDAO.getHistory(x, y);
ArrayList <Integer> totalWins = new ArrayList <Integer> ();

for (history his : history) {
       String res = his.getRes();
             if (res.equals("Vundet")) {
                    int totalW = 0; 
                    totalW++;
                    totalWins.add(totalW);
              System.out.print(totalWins);
}}

Для уверенности я упомяну, что ArrayList<history> относится к классу, который хранит все данные. Теперь я хочу обрабатывать только те объекты, где значение res равно Vundet.

Ответы [ 4 ]

4 голосов
/ 28 января 2020

Кажется, вы пытаетесь посчитать записи "Vundet". Это можно сделать, увеличив переменную счетчика:

int count = 0;
for (history his : history) {
  if (his.getRes().equals("Vundet")) {
    count++;
  }
}
System.out.println(count);

Вы также можете записать это, используя Java streams :

long count = history.stream()
    .map(history::getRes)
    .filter("Vundet"::equals)
    .count();
1 голос
/ 28 января 2020

Чтобы получить sum элементов в соответствии с вашим вопросом, вы можете использовать потоки.

int sum = history.stream()
    .filter(his->his.getRes().equals("Vundet"))
    .mapToInt(his->his.getWins()) // assuming this getter exists.
    .sum();

0 голосов
/ 28 января 2020

Ваш код печатает [1,1,1,1,1], потому что вы печатаете totalWinds, то есть List.

Если вы хотите напечатать, сколько раз history.getRes().equals("Vundet") произошло, то вы можете или переместить int totalW = 0; из l oop или использовать параметр потока.

totalW из Л oop.

ArrayList <History> history = historyDAO.getHistory(x, y);

int totalW = 0; // Out of the loop so it does not get initialize every iteration
for (history his : history) {
    String res = his.getRes();
    if (res.equals("Vundet")) {
        totalW++;
    }
}
System.out.println(totalW);

Или с потоками.

ArrayList <History> history = historyDAO.getHistory(x, y);
long total = history.stream()
                .filter(his -> his.getRes() != null && !his.getRes().isEmpty() && his.getRes().equals("Vundet"))
                .count();
0 голосов
/ 28 января 2020

Хорошо, вот в чем проблема: totalW - это переменная, которую вы используете для подсчета случаев, вы хороши до этого момента. Единственная проблема заключается в объявлении этой переменной, делающей ее равной 0, которая должна быть выше, в противном случае она похожа на подсчет 1, а затем сброс на 0 и затем снова на 1 вместо перехода к 2.

Другая проблема заключается в том, что вы хотите выведите значение этой переменной в конце, а не каждый раз, когда вы рассчитываете, поэтому вот последнее:

ArrayList <history> history = historyDAO.getHistory(x, y);
ArrayList <Integer> totalWins = new ArrayList <Integer> ();

for (history his : history) {
   String res = his.getRes();
         int totalW = 0; 
         if (res.equals("Vundet")) {

                totalW++;
                totalWins.add(totalW);

}System.out.print(totalWins);
}
...