2015-06-16 52 views
1

我有List<Element> elements,其中class元素的属性为id - 它很长。我也有List<Long> ids。现在我需要从elements列表中有id道具的列表对象存在于ids列表中。从指定ID的另一个列表中获取元素列表

我用这两个循环,但我认为这不是最好的选择。

我该如何提高自己的表现?

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

PLZ份额我们的代码。 – Bikku

+0

*我用这两个for循环*你可以发布你的循环,让我们明白你做了什么? – Blip

+0

我用例子编辑 – user3802040

回答

4

如何提高我的表现?

您可以使用HashMap作为您的元素使用id作为关键。然后,在您的idsList上使用单个循环进行查找。 HashMap具有不变的查找复杂度。

+0

'HashSet'会更好。 – OldCurmudgeon

+0

由于HashSet是由HashMap支持的,我不完全确定这一点,你能给我一个提示,为什么它会更好(除了明显的设置属性,我认为最有可能的是OP所期望的)? – cygery

+0

由于'Set'只保存一组项目,'Map'包含'Key/Value'对。 OP只需要不存在从键到值的转换,所以'Set'更合适.. – OldCurmudgeon

1

做一个集ID是这样的:

Set<Long> idSet = new HashSet<>(ids); 
    List<Element> selected = elements.stream() 
     .filter(element -> idSet.contains(element.getId())) 
     .collect(Collectors.toList()); 
0

可以使用Google Guavafiltering为:

Iterable<Element> filteredElements = Iterables.filter(elements, new Predicate<Element>() { 
     @Override 
     public boolean apply(Element element) { 
      return ids.contains(element.getId()); 
     } 
    });