2015-06-16 2 views
1

У меня есть List<Element> elements, где класс Element имеет свойство id - оно длинное. У меня также есть List<Long> ids. Теперь мне нужно получить от elements объектов списка, которые имеют id прокси, которые есть в ids.Получить список элементов из другого списка с указанными идентификаторами

Я использовал для этих двух циклов, но я думаю, что это не лучший вариант.

Как я могу улучшить свою работу?

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

плз долю ур код. – Bikku

+0

* Я использовал для этих двух циклов * вы могли бы разместить свои петли, чтобы мы поняли, что вы сделали? – 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

сделать набор идентификаторов, как это:

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()); 
     } 
    }); 
Смежные вопросы