如何获得不是第一个的indexOf元素

时间:2019-03-19 18:49:07

标签: java arraylist indexof

假设

ArrayList<Integer> list =  Arrays.asList(new Integer[] {1,2,3,4,5,6,1,8,9});

查找第二次出现

我想获取秒的索引查找(多个)包含的元素“ 1”,但是list.indexOf(1)将始终返回{{1} }(这是第一个发现)。

性能

我想不使用0for之类的循环来执行此操作。 由于我在游戏中需要它,因此使用循环根本没有效率。

编辑:有没有办法在没有迭代器的情况下获取某些元素“ strong”的“ indexOf” ?

4 个答案:

答案 0 :(得分:5)

不进行迭代就不能这样做。
例如,indexOf进行迭代。

public int indexOf(Object o) {
    if (o == null) {
        for (int i = 0; i < size; i++)
            if (elementData[i]==null)
                return i;
    } else {
        for (int i = 0; i < size; i++)
            if (o.equals(elementData[i]))
                return i;
    }
    return -1;
}

lastIndexOf有效。
如您所见,如果担心的话,根本不会使用Iterator<Integer>

顺便说一句,这不是性能方面的问题
您是否具有包含数百万个元素的数组?如果有,请考虑更改数据结构类型。

答案 1 :(得分:1)

如果您非常关注性能,请使用HashMap<Integer, List<Integer>>。然后,如果您希望元素m第n次出现,则可以执行map.get(m).get(n)。您的地图包含元素及其相应的索引。

建立地图后,查询的时间复杂度为O(1)

示例:

    public static void main(String[] args){
        int[] a = {1, 2, 1, 3, 4, 1};
        Map<Integer, List<Integer>> map = new HashMap<Integer, List<Integer>>();

        for(int i = 0; i < a.length; i++){
            if(map.containsKey(a[i])){
                map.get(a[i]).add(i);
            }else{
                map.put(a[i], new ArrayList<Integer>());
                map.get(a[i]).add(i);
            }
        }

        // second index of 1. Note that index starts from 0.

        System.out.println(map.get(1).get(1));
    }

结果:

  

2

答案 2 :(得分:0)

list.indexOf(1, list.indexOf(1) + 1);

first 参数1是要搜索的对象。 second 参数list.indexOf(1) + 1是搜索的起始索引。

答案 3 :(得分:0)

list.subList(list.indexOf(1) + 1, list.size()).indexOf(1)