Список фильтров без итерации - PullRequest
0 голосов
/ 14 апреля 2011

Возможно ли в Java отфильтровать список по некоторым критериям без итерации? У меня есть список размером 10000 бинов, где эти бины имеют свойство типа boolean. Если я хочу отфильтровать этот список на основе этого логического свойства, нужно ли перебирать весь список или есть какой-то другой способ?

Ответы [ 4 ]

2 голосов
/ 14 апреля 2011

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

1 голос
/ 14 апреля 2011

Вы можете написать класс-оболочку, который реализует интерфейс List и просто «скрывает» все bean-компоненты с указанным свойством.Однако многие операции (например, каждая индексная функция) будут очень неэффективными, поэтому это зависит от того, что именно вы хотите сделать с «отфильтрованным» списком.

1 голос
/ 14 апреля 2011

Если вы имеете в виду, не используя Iterator, то ответ - Да. Например:

for (int i = 0; i < list.size(); ) {
    MyElement element = list.get(i);
    if (element.getMyProperty()) {
        list.remove(i);
    } else {
        i++;
    }
}

В зависимости от реализации List, это может быть более дорогим способом реализации фильтрации, чем использование Iterator и Iterator.remove(). (Например, если list равен LinkedList, то list.get(i) и list.remove(i) оба равны O(N), и, следовательно, фильтрация списка равна O(N^2). В отличие от этого, фильтрация того же списка с Iterator будет O(N).)


Однако, если вы спрашиваете, можете ли вы отфильтровать свой список, не проверяя каждый элемент в списке, тогда ответ - Нет. Вам потребуется некоторая вторичная структура данных или список, который нужно упорядочить по свойству, чтобы добиться лучшего чем O(N) фильтрация.

0 голосов
/ 25 мая 2016

Вы можете сделать это с помощью потока в Java 8. Предположим, у вас есть список электрических и неэлектрических автомобилей, и вы хотите извлечь только электрические:

List<Car> electricCars= cars.stream().filter(c -> c.isElectric()).collect(Collectors.toList());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...