在ArrayList中查找重复值的索引

7

我有一个ArrayList,其中包含不同索引处的重复值。 例如 {"Indian","American","Chinese","Australian","Indian","Russian","Indian"} 如您所见,值 - "Indian" 存在于索引 - 046

我需要知道所有这些索引,其中存在 "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()中,它总是返回在数组中找到的第一个值的索引。
所以如果重复存在于索引-257,我得到的索引数组大小为3。但实际上的值是{2,2,2,}
2个回答

3

在这种情况下,使用基于索引的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]

是的,这个解决方案稍微更有效率,因为原始的for循环隐式创建的迭代器将维护自己独立的索引。 - Robin Green
你能解释一下这个答案中的filterTerm是什么吗? - Jack

2

您需要知道当前数组中的索引,而不是它被找到的第一个索引。为了跟踪它,可以将

int i = 0;

在循环之前,在循环的最后放置。
i++;

然后变量i告诉您找到了哪个值,因此您可以将i添加到索引列表中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接