ArrayList<Integer> list = Arrays.asList(new Integer[] {1,2,3,4,5,6,1,8,9});
我想获取秒的索引秒查找(多个)包含的元素“ 1”,但是list.indexOf(1)
将始终返回{{1} }(这是第一个发现)。
我想不使用0
或for
之类的循环来执行此操作。
由于我在游戏中需要它,因此使用循环根本没有效率。
编辑:有没有办法在没有迭代器的情况下获取某些元素“ strong”的“ indexOf” ?
答案 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)