Список фильтрации без использования итератора

Мне нужно отфильтровать список размером 1000 или более и получить из него подсписок. Я не хочу использовать итератор.

1) В настоящее время я повторяю список и сравниваю его с помощью Java. Это трудоемкая задача. Мне нужно повысить производительность моего кода.

2) Я также пытался использовать Google Collections (Guava), но я думаю, что он также будет повторяться в фоновом режиме.

  Predicate<String> validList = new Predicate<String>(){  
      public boolean apply(String aid){  
          return aid.contains("1_15_12");  
      }  
  }; 
   Collection<String> finalList =com.google.common.collect.Collections2.filter(Collection,validList);

Может ли кто-нибудь предложить мне, как я могу получить подсписок быстрее без повторения или, если используется итератор, я получу результат сравнительно быстрее.


person EnoshBansode    schedule 05.08.2011    source источник
comment
1000 не очень большое число. И это список с последовательным доступом, итерация неизбежна.   -  person Nivas    schedule 05.08.2011
comment
Я думаю, что итератор неизбежен при фильтрации, так как каждый элемент должен быть проверен.   -  person 卢声远 Shengyuan Lu    schedule 05.08.2011
comment
@Nivas: Ваш комментарий должен быть ответом   -  person Jim Garrison    schedule 05.08.2011
comment
@ Джим Гаррисон, оглядываясь назад, да. Но так как другие ответили тем же, я воздержусь. В любом случае, сейчас это не добавляет большой ценности.   -  person Nivas    schedule 05.08.2011


Ответы (4)


Подумайте, что произойдет, если вы вызовете size() в своем подсписке. Это должно проверять каждый элемент, так как каждый элемент может изменить результат.

Если у вас есть очень специализированный способ использования вашего списка, который означает, что вы не трогаете каждый элемент в нем, не используете произвольный доступ и т. д., возможно, вам вообще не нужен интерфейс List . Если бы вы могли рассказать нам больше о том, что вы делаете, это действительно помогло бы.

person Jon Skeet    schedule 05.08.2011
comment
@Gabriel: я думаю, что это это ответ: если ему нужен общий интерфейс List, он не сможет добиться большего успеха, чем перебирать весь список. Если ему не нужен весь интерфейс List, он может использовать другой интерфейс, который можно реализовать без итерации. - person Jon Skeet; 07.08.2011
comment
Теоретически это не совсем так. В зависимости от использования (как вы написали) он может использовать список с ограничениями, добавлять в список в определенном порядке и т. д., чтобы предотвратить необходимость повторения всей коллекции и остаться со списком. Но это зависит от того, я бы не дал такой ответ, я бы сделал комментарий, чтобы получить больше информации и ответить потом, чтобы дать ему решение его проблемы. Поскольку это субъективно, я забираю свой отрицательный голос (если вы отредактируете). - person Gabriel Ščerbák; 07.08.2011
comment
@Gabriel: я не понимаю, как можно избавиться от необходимости size() проверять каждый элемент. В любом случае, я рассматриваю это как ответ так же, как и ваш: в нем говорится, почему вы не можете вообще уйти, не изучив каждый элемент (согласно итератору), и дается предложение для дальнейшего : а именно думать о том, что на самом деле нужно ОП от результата. - person Jon Skeet; 07.08.2011
comment
Я не уверен, что вы подразумеваете под аргументом size(). ArrayList и LinkedList запоминают свои размеры в поле, которое обновляется при каждой операции изменения размера. Метод size() просто возвращает значение этого поля, он ничего не проверяет. Можете ли вы объяснить, что вы имеете в виду? - person Gabriel Ščerbák; 07.08.2011

Список — это упорядоченный набор объектов. Поэтому вы должны повторить его, чтобы отфильтровать.

person never    schedule 05.08.2011

Обогащаю свой комментарий: я думаю, что итератор неизбежен при фильтрации, так как каждый элемент должен быть проверен.

Что касается Collections2.filter, то он отличается от простого фильтра: возвращаемый Collection по-прежнему является «предикативным». Это означает, что IllegalArgumentException будет выброшено, если неудовлетворенный элемент будет добавлен к Collection.

person 卢声远 Shengyuan Lu    schedule 05.08.2011

Если производительность действительно вас беспокоит, скорее всего, предикат довольно медленный. Что вы можете сделать, так это разбить список Lists.partition, отфильтровать параллельно (вы должны написать это), а затем объединить результаты.

Возможно, существуют лучшие способы решения вашей проблемы, но нам потребуется больше информации о предикате и данных в списке.

person Gabriel Ščerbák    schedule 07.08.2011