Фильтрация списка без использования итератора - PullRequest
2 голосов
/ 05 августа 2011

Мне нужно отфильтровать список размером 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);

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

Ответы [ 4 ]

2 голосов
/ 05 августа 2011

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

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

0 голосов
/ 07 августа 2011

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

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

0 голосов
/ 05 августа 2011

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

Относительно Collections2.filter он отличается от простого фильтра: возвращенный Collection все еще "Предикат". Это означает, что IllegalArgumentException будет выброшено, если к Collection.

будет добавлен неудовлетворенный элемент.
0 голосов
/ 05 августа 2011

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

...