Посчитать одинаковые значения в строке ArrayList - PullRequest
0 голосов
/ 02 февраля 2020

Я получил ArrayList, который состоит из двух типов значений: выигрыш и проигрыш. Я пытаюсь подсчитать, сколько раз подряд в ArrayList происходил выигрыш. Я до сих пор не смог выполнить задачу.

ArrayList <String> wins = new ArrayList<String>();
System.out.print(wins);
//[Won, Won, Won, Loss, Loss, Won, Won, Loss, Loss, Loss, Loss, Loss, Won, Won, Won, Won, Won, Loss]

String value = wins.get(0);

int maxValue=1;
int count = 1 ;

for (int i=1; i<wins.size(); i++){
     if(wins.get(i) == wins.get(i-1)){      
        count++;       
        if(count >= maxValue){
            maxValue = count;
            value = wins.get(i);
        }
    }
}

System.out.println(value + " : " + maxValue );
// Won : 1

Результат явно неверен, поскольку выигрыш происходил 4 раза подряд в некоторый момент в ArrayList. Может ли кто-нибудь помочь мне с этим?

Ответы [ 2 ]

1 голос
/ 02 февраля 2020

Вы должны попробовать, используя равно, а не ссылку == равенство:

if(wins.get(i) == wins.get(i-1)){  

Должно быть:

if(wins.get(i).equals(wins.get(i-1))) {  

Почему это может работать со строкой, если константа интернирована это не всегда так.

И последнее, но не менее важное: вы должны сбросить счет при несовпадении равенства!

Как в:

for (int i=1; i<wins.size(); i++){
  String current = wins.get(i);
  if (current.equals(wins.get(i-1))) {      
    count++;       
    if(count >= maxValue){
      maxValue = count;
      value = current;
    }
  } else {
    count = 0;
  }
}

Обратите внимание, что вы вероятно, вообще не нужно value.

0 голосов
/ 02 февраля 2020

Если вы не хотите переписывать предыдущий код в массив логических значений, и по какой-то неуказанной причине его нужно привязывать к строкам, вы можете использовать такую ​​конструкцию:

for (int i=1; i<wins.size(); i++) {
    if(wins.get(i).equals(wins.get(i-1))) {      
        count++;       
        if(count >= maxValue) {
            maxValue = count;
            value = wins.get(i);
        }
    } else {
        count = 0;
    }
}

Строки имеют свои собственный метод сравнения. Вы получаете ответ «1», потому что ваш код думает, что все эти строки НЕ равны.

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

...