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

How to get indexOf element which isn't the first

假设

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

查找第二次出现

我想获得索引 second发现(多个)包含的元素“1”但是list.indexOf(1) 将始终 return 0 (因为这是第一个发现)。

性能

我想在不使用 forwhile 等循环的情况下执行此操作。 因为我需要它来玩游戏,所以使用循环根本没有效率。

编辑:有没有什么方法可以在没有迭代器的情况下获得"indexOf"一些元素

如果不迭代就无法做到这一点。
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>,如果您担心的话。

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

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

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

如果您非常在意性能,请使用 HashMap<Integer, List<Integer>>。那么如果你想要第 n 次出现的元素 m,你可以 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

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