是否可以根据其中一个属性确定ArrayList中元素的ArrayList-index?
在我的特定情况下我有一个对象“worker”,其属性为“name”和“worker_id”。 worker_id是我从数据库中获取的ID。
由于 ArrayList中的第一个worker-object不一定以0 开头(并且可能有间隙),因此它与每个元素在此ArrayList中的索引的ID不同。
现在我想基于其属性“worker_id”确定ArrayList中worker-object的这个特定索引。但是:因为列表可能很长,所以我不想每次迭代worker-ArrayList。
使用HashMap可能是一个解决方案,但我想尽可能使用ArrayList,因为我通常不需要密钥(在这种情况下除外)。
欢迎任何建议!
提前谢谢你, 伊戈尔。
答案 0 :(得分:3)
由于ArrayList中的第一个worker-object不一定以0开头(并且可能有间隙),因此它与每个元素在此ArrayList中的索引的ID不同。
听起来,列表至少已排序?在这种情况下,您可以使用二进制搜索,这比列表的线性扫描稍快。
另一个选择是,如果两个工作人员具有相同的equal
,则将其定义为worker_id
。那你就可以做int index = workerList.indexOf(new Worker(idToSearchFor));
使用HashMap可能是一个解决方案,但我想尽可能使用ArrayList,因为我通常不需要密钥(在这种情况下除外)。
嗯,说实话,当我使用地图时,很少因为我无法用列表执行,而是因为界面使用可以更好地使用地图,从而获得更清晰的代码。所以,即使你可能认为HashMap是一种过度杀伤,它可能是值得的,仅仅是因为它稍微更符合逻辑,并且代码最终会更容易阅读。
答案 1 :(得分:1)
您可以考虑使用LinkedHashMap
。这提供了两全其美的优点:由于其可预测的迭代顺序和,它可以表现为列表,同时提供快速(O(1))基于密钥的查找。
如可以预期的那样,价格会略微降低性能(与ArrayList
相比)。
答案 2 :(得分:0)
您需要检查每个对象的ID。我猜没有直接的方法。 迭代所有对象并检查id。
答案 3 :(得分:0)
类似的东西:
List<Worker> workers = // ...
for (int i = 0; i < workers.size(); i++) {
if (/* ... */) {
return i;
}
}
答案 4 :(得分:0)
int find(List <A> list, Object sth)
{
Iterator it = list.iterator();
int index = 0;
while(it.hasNext());
A current = it.next();
if (el.getSth().equals(element)) {
return index;
}
index++;
}
return -1;
}
答案 5 :(得分:0)
创建与最大worker_id值一样大的List。插入对象时,将其插入worker_id编号。 像
list.add(obj.worker_id,OBJ);
检索时
list.get(obj.worker_id);
是的,它不是空间有效的解决方案,节省空间的解决方案是使用Hashmap(或其变体),正如其他人已经提到的那样。
答案 6 :(得分:0)
我认为你有两个选择: