2016-10-17 3 views
1

Итак, у меня есть метод, в котором я передаю ArrayList идее этого метода - взять вход и разбить каждый набор строк соответствия в свой отдельный список. Вот какой-то псевдокод.Для путаницы путаницы, почему это не цикл?

Array = (a,a,a,b,c,d,d,e,e,e,e,e,f,f,s) 

Так что я хочу, чтобы этот алгоритм должен был разбить этот массив на двумерный массив с равными элементами. Как это.

A[0][] = (a,a,a) 
A[1][] = (b) 
A[2][] = (c) 
A[3][] = (d,d) 
A[4][] = (e,e,e,e,e) 
A[5][] = (f,f) 
A[6][] = (s) 

Так что я пытался сделать, это положить его в цикле, что проверить дополнительный элемент вперед, чтобы увидеть, если он НЕ равен, то он знает, T

int equalStringGroupIndex = 0; 
    int i = 0; 

    for(int first = 0, second = 0 ; input.get(first).equals(input.get(second)); second++){ 
     equalStringGroups[equalStringGroupIndex][i] = input.get(second); 
     i++; 
     //This if statment checks the element ahead then equals first = second, But when it jumps back to the top of the loop in the debugger it does'nt seem to check it even though in my Watches it's True 
     if(!input.get(first).equals(input.get(second + 1))){ 
      equalStringGroupIndex++; 
      i = 0; 
      first = second; 
     } 
    } 

Почему это не цикл после добавления первого набора 'a' в 2D-массив Спасибо.

ОБНОВЛЕНИЕ: Спасибо за помощь, я решил пойти по маршруту HashMap. Вот что я придумал. Кажется, он работает.

private HashMap<String, Integer> countDuplicates(ArrayList<String> input){ 

    HashMap<String, Integer> duplicates = new HashMap<>(); 

    //Value init loop, sets all values to 0; 
    for (String s : input){ 
     Integer valueInitVar = 0; 
     duplicates.put(s, valueInitVar); 
    } 

    //Increases the value by 1 each time the same key is encountered; 
    for (String s : input){ 
     Integer tempDuplicateAmount = duplicates.get(s); 
     //I could use the '++' operator but I feel ' var += 1' is much nicer to read; 
     tempDuplicateAmount += 1; 
     duplicates.put(s, tempDuplicateAmount); 
    } 

    return duplicates; 
} 
+0

Что такое 'input'? –

+0

Сортированный массив строк – Definity

+1

И почему это * что * происходит? –

ответ

1

я предлагаю что-то другое:

List<List<Whatever>> splitSame(List<Whatever> input) { 
    List<List<Whatever>> rv = new ArrayList<>(); 
    List<Whatever> currentValues = new ArrayList<>(); 
    Whatever lastChecked = input.get(0); 
    for (Whatever what : input) { 
    if (lastChecked.equals(what)) { 
     currentValues.add(what); 
    } else { 
     rv.put(currentValues); 
     currentValues = new ArrayList<>(); 
    } 
    lastChecked = what; 
    } 
    rv.put(currentValues); 
    return rv; 

Дело в том, вы можете легко дойти пешком за вами один список ввода, чтобы собрать одинаковые объекты в подсписков. И, в конце концов, вы просто держите их вместе.

Я уверен, что некоторые гуру java8 могут переписать выше, используя потоки во что-то более сжатое и менее сложное.

Отсутствие необходимости в дополнительных двухмерных матрицах здесь вообще!

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

+0

Определенно лучший способ сделать это. –

+0

@MichaelPickett Где, я должен признать, List и ListList как-то выглядит страшно; что делает все труднее читать, чем на самом деле. Вероятно, это действительно один из тех случаев, когда какая-то русловая магия действительно трубит «старую школу». – GhostCat

+0

Я не считаю это страшным, но если вы исходите из «старой школы», это может быть немного подавляющим. С тщательным прочтением это легко понять. –

0

Если вы собираетесь придерживаться делать это таким образом, я предлагаю меняющийся ваш условный для цикла, чтобы быть second < input.size (or length)

int equalStringGroupIndex = 0; 
int i = 0; 

for(int first = 0, second = 0 ; second < input.size(); second++){ 
    equalStringGroups[equalStringGroupIndex][i] = input.get(second); 
    i++; 

    if(!input.get(first).equals(input.get(second + 1))){ 
     equalStringGroupIndex++; 
     i = 0; 
     first = second+1; 
    } 
} 

Таким образом, вы зацикливание только через массив, без исключений.

Я также изменил свой first = second к first = second+1 потому что, как только вы обнаружили, что они не равны, вы должны установить первый индекс к следующему и делая first = second вы не являетесь.

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