我得到一个可迭代的列表,我使用以下代码
进行迭代for (IssueField issueObj : issue.getFields())
{
System.out.println(issueObj.getId());
}
该列表具有以下结构
[IssueField{id=customfield_13061, name=Dev Team Updates, type=null, value=null},
IssueField{id=customfield_13060, name=Development, type=null, value={}},
IssueField{id=customfield_11160, name=Rank, type=null, value=1|i0065r:},
IssueField{id=customfield_13100, name=TM Product, type=null, value=IntelliGlance},
IssueField{id=customfield_11560, name=Release Notes, type=null, value=null},
IssueField{id=customfield_13500, name=Request Type, type=null, value=null},
IssueField{id=customfield_13900, name=Category, type=null, value=null},
IssueField{id=environment, name=Environment, type=null, value=null}]
列表中有超过100个这样的对象。有没有办法我可以直接获得所需的对象值而无需迭代所有值。目前正在使用我认为效率不高的东西。
for (IssueField issueObj : issue.getFields())
{
if(issueObj.getId().equalIgnoreCase(someId)){
//Object Found
}
}
答案 0 :(得分:4)
如果您希望能够像您所说的那样频繁搜索大型数据集,那么您应该使用HashMap,其中字符串是getId()中的值。搜索HashMap的大O时间复杂度是O(1),其中列表是O(n)。这将为您提供所需的效率。
答案 1 :(得分:1)
如果您使用的是Java 8,可以试试这个
<your-object> result1 = <your-list>.stream()
.filter(x -> "jack".equals(x.getId()))
.findAny()
.orElse(null);
首先它将转换列表转换为Streams,然后你想要id如“jack”,如果'findAny'则返回对象,否则返回null
答案 2 :(得分:0)
如果您不想迭代孔Collection来获取所需的对象,则需要将对象存储在最合适的集合中,因此如果您想通过其id获取元素,我认为最有效的方法是通过使用Hashmap,然后使用get函数来检索所需的元素。
HashMap实现为基本操作(get和put)提供了恒定时间性能,假设散列函数在桶之间正确地分散元素。对集合视图的迭代需要与HashMap实例的“容量”(桶的数量)加上其大小(键 - 值映射的数量)成比例的时间。因此,如果迭代性能很重要,则不要将初始容量设置得太高(或负载因子太低)非常重要。 Source