Поиск индекса повторяющихся значений в ArrayList

У меня есть ArrayList, который содержит повторяющиеся значения в индексе diff diff. например, {"Indian","American","Chinese","Australian","Indian","Russian","Indian"}, как вы можете видеть, значение - "Indian" существует по индексу - 0, 4 и 6.

Мне нужно знать все эти индексы, где существует "Indian", и создать из них список массивов. Вот мой код:

public void filter(){


    categoryArray = Arrays.asList(category);

    for(String k : category){
        //Log.v("filter", filterTerm);
        if(k.equals(filterTerm.toLowerCase()))
        {               
            int p = categoryArray.indexOf(k);                   
            Log.v("index of categArr", ""+p);
            String id = Integer.toString(p);
            indexes.add(id);


        }// end of if
    }// end of for

Здесь я получаю, сколько раз происходит дублирование, получая размер индексов (ArrayList), но когда я проверяю значения . Это одно значение для всего индекса, поскольку в методе: indexOf() он всегда возвращает индекс первого значения, которое он находит в массиве.

Итак, если в индексе существует дубликат - 2,5,7, я получаю размер массива индекса как 3. Но значения {2,2,2,};


person Ankit    schedule 22.04.2011    source источник


Ответы (2)


Вам нужно знать, в каком индексе в массиве вы находитесь в данный момент, а не в первом индексе, где его можно найти. Чтобы отслеживать это, поместите

int i = 0;

перед циклом и в самом конце цикла поместите

i++;

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

person Robin Green    schedule 22.04.2011

Это ситуация, когда цикл for на основе индекса более подходит, чем расширенный цикл for, который вы используете, поскольку вам нужно получить индекс.

Вы можете основывать всю свою работу на исходном массиве, а не преобразовывать его в список, и я подозреваю, что вы стремились к совпадению без учета регистра.

public void filter(){
    for(int i=0; i<category.length; i++){
        if(category[i].equalsIgnoreCase(filterTerm))
        {               
            String id = Integer.toString(i);
            indexes.add(id);
        }
    }
}

Если у вас есть ArrayList, а не массив, конечно, аналогичный код будет работать, но с использованием list.get(i) вместо category[i].

person Don Roby    schedule 22.04.2011
comment
Да, это решение несколько более эффективно, поскольку итератор, неявно созданный исходным циклом for, будет поддерживать свой собственный отдельный индекс. - person Robin Green; 22.04.2011
comment
не могли бы вы объяснить, что такое filterTerm в этом ответе ?? - person Jack; 09.08.2017