2015-05-29 3 views
5
public static String[][][] cleanUp(String[][][] array) { 
    for (int f = 0; f < array.length; f++) { 
     for (int g = 0; g < array[f].length; g++) { 
      int position = 0; 
      //boolean flag = false; 
      int count = 0; 
      for (int h = 0; h < array[f][g].length; h++) { 
       if (array[f][g][h].equals(array[f][g][h+1])) count++; 
       else { 
        ArrayList<String> temp = new ArrayList<String>(Arrays.asList(array[f][g])); 
        for (int i = count - 1; i > position; i--) { 
         temp.remove(i); 
         position = i-1 ; 
        } 
        temp.set(position, array[f][g][h] + " (" + count + ")"); 
       } 
      } 
     } 
    } 
    return array; 
} 

По существу, я хочу сделать 3D-массив строк и иметь в каждом массиве 1D количество отображаемых значений для повторяющихся значений. Например, если бы я имел массив строк, как это:Объединение идентичных значений в массиве

[go, go, go, go, go, go] 
[go, stop, stop, stop] 

он стал бы:

[go (5)] 
[go (1), stop (3)] 

Как я мог это сделать, и что это я делаю неправильно?

+6

Вы можете начать правильно сравнение строк (использование равно, не ==) – Eran

+1

Насколько я могу судить, 2 внешних размеры массива не имеют никакого отношения к дедупликации. Если это так, было бы легче подумать о том, как это сделать для 'String []', а затем просто переносить вызовы этого метода на два для циклов для итерации внешних измерений. –

+0

@ Эйран Упс. Я исправил это, но он все еще не работает. Я получаю «ArrayIndexOutOfBoundsException» в любом случае. –

ответ

5

Вы должны изменить свой последний внутренний цикл:

 int count = 0; 
     for (int h = 0; h < array[f][g].length; h++) { 
      if (array[f][g][h].equals(array[f][g][h+1])) count++; 
      //You dont check for out of bound here, so `h + 1` will cause out of bound error 
      else { 
       ArrayList<String> temp = new ArrayList<String>(Arrays.asList(array[f][g])); 
       for (int i = count - 1; i > position; i--) { 
        temp.remove(i); 
        position = i-1 ; 
       } 
       temp.set(position, array[f][g][h] + " (" + count + ")"); 
      } 
      //Count is not reset after this, so this will be wrong! 
     } 

Как бы это сделать:

 ArrayList<String> tmp = new ArrayList<>(); 
     for (int h = 0; h < array[f][g].length; h++) { 
      int count = 1; 
      while(h + count < array[f][g].length && array[f][g][h].equals(array[f][g][h+count])) 
       count++; 
      tmp.add(array[f][g][h] + "(" + count + ")"); 
      h += count - 1;//Update h to skip identical element 
     } 

ArrayList tmp будет содержать результат для array[f][g], и вы должны заметить, как я обновлю h соответственно пропустить все одинаковые элементы.

Обновление: тестирование result

+0

Хмм, не помогает. Я все еще получаю [это] (https://i.imgur.com/oJdL9tn.png). –

+0

@CalvinKinzie извините, я не могу просмотреть ссылку (это моя сетевая проблема), однако, я проверил свой код, результат [здесь] (http://ideone.com/78VQ8u). Поэтому я думаю, что прямо использовать его для трех или более размерных массивов, вам больше не нужно использовать 'position' :) –

+0

А, спасибо. Я также понял, что моя ошибка заключалась в том, что я никогда не ставил массив [f] [g] = tmp.toArray (новый String [tmp.size()]); после закрывающей скобки в вашем коде (я бы предложил добавить это) , Теперь все хорошо. –

Смежные вопросы