【问题标题】:Getting first element of specific type from ArrayList从 ArrayList 获取特定类型的第一个元素
【发布时间】:2014-04-21 19:20:49
【问题描述】:
我有 ArrayList 类型的 Animal。此列表包含 10 个对对象的引用,即 3 只狗、3 只猫和 4 只鸟。所有三种类型(Dog、Cat 和 Bird)都继承自 Animal。动物的顺序
有没有比迭代整个列表并使用instanceof 运算符更有效的方法从列表中获取第一个Cat?
例如。
Cat cat = null;
for(Animal animal: animalsList){
if( animal instanceof Cat){
cat = animal;
break;
}
}
【问题讨论】:
标签:
java
list
collections
arraylist
【解决方案1】:
不,就您需要执行的操作而言,这是最快的速度:在ArrayList 中搜索特定对象始终是线性的(即O(n))。
然而,就可读性而言,您可以通过将搜索隐藏在一个辅助方法中来改进这一点,该方法接受一个列表和一个类型,并找到该项目的第一次出现:
public static <E> E findFirst(List<E> list, Class<E> itemType) {
for (E element : list) {
if (itemType.isInstance(element)) {
return element;
}
}
return null;
}
如果您需要比这更快的搜索速度,您将需要不同的数据结构。
【解决方案2】:
创建一个持续跟踪列表中第一个Cat 对象的类。否则,此搜索是从列表中获取第一个 Cat 对象的最高效方法。
【解决方案3】:
如果您不知道阵列中Cats 的位置,或有关阵列构成的任何其他信息(例如,所有Dogs 先出现,然后Cats 和最后是Birds),然后不,没有更好的方法。