我有一个List<Element> elements
,其中类Element具有属性id
- 它是Long。我还有List<Long> ids
。现在我需要从elements
列表对象中获取id
列表中存在ids
道具的列表对象。
我用这两个for循环,但我认为这不是最好的选择。
我如何改善表现?
public class Element{
Long id;
public Element(Long id){
this.id = id;
}
public Long getId( ){
return id;
}
public static void main(String []args){
List<Element> elements= Arrays.asList(new Element(1),new Element(2),new Element(3), new Element(5), new Element(5));
List<Long> ids= Arrays.asList(3,4,1);
List<Element> returnList = new ArrayList<Alement>();
for(int i = 0; i < elements.size(); i++) {
for(int j = 0; j < ids.size(); j++) {
if (elements.get(i).getId() == ids.get(j))
returnList.add(elements.get(i));
}
}
}
}
答案 0 :(得分:4)
我如何改善表现?
您可以使用id
作为键,使用HashMap
作为元素。然后,在ids
List
上使用单个循环进行查找。
HashMap
具有不变的查找复杂性。
答案 1 :(得分:1)
制作一组这样的ID:
Set<Long> idSet = new HashSet<>(ids);
List<Element> selected = elements.stream()
.filter(element -> idSet.contains(element.getId()))
.collect(Collectors.toList());
答案 2 :(得分:0)
您可以使用Google Guava filtering:
Iterable<Element> filteredElements = Iterables.filter(elements, new Predicate<Element>() {
@Override
public boolean apply(Element element) {
return ids.contains(element.getId());
}
});