Фильтрация списка массивов

#java

#java

Вопрос:

У меня есть 2 билета на массив и filterTickets, я хочу вернуть новые билеты, которые не содержат элемента из filterTickets. Я использую этот код, но фильтр не работает.

 List < Ticket > a = new ArrayList <>();
for (String string: ticketsFilter) {
    for (Ticket ticket: tickets) {
        if (ticket.getTicketId().equals(string))
            a.add(ticket);
    }
}
  

Комментарии:

1. Я думал, вы хотите добавить в, a если его нет в ticketsFilter списке. В любом случае, переверните два цикла, затем замените внутренний цикл вызовом contains . Это дало бы вам: for (Ticket ticket : tickets) { if (! ticketsFilter.contains(ticket.getTicketId())) { a.add(ticket); } } — Для повышения производительности, ticketsFilter должно быть Set , а не List .

2. Я также использую not, но это также возвращает все элементы без фильтра

3. Java 8 список путей<Билет> filteredTickets = tickets.stream().filter(t -> ticketsFilter.stream().anyMatch(s-> s.equals(т.getTicketId())).собирать(коллекторы. ToList());

Ответ №1:

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

  List<String> ticketsFilter = new ArrayList<>();
 ...
 if(!ticketsFilter.contains(ticket.getTicketId())){
     a.add(ticket);
 }
  

Комментарии:

1. Лучше использовать Set<String> ticketsFilter = new HashSet<>(); . Set работает contains алгоритмически быстрее (здесь постоянное время), чем любая реализация List .

2. не могли бы вы вставить свой код сюда или обновить в вопросе? это должно сработать в моем понимании вашего вопроса

Ответ №2:

Решение Java 8 с использованием stream API:

 List<Ticket> a = tickets.stream()
                .filter(e->!ticketsFilter.contains(e.getTicketId()))
                .collect(Collectors.toList());
  

Комментарии:

1. но поддерживает ли это API 19, потому что в Android Studio, когда я использую его, эта информация говорит о вызове API 24

2. @Andrinovariswanto В вашем вопросе даже не упоминалось, что это для Android, поэтому этот ответ имеет отношение к вопросу в его нынешнем виде.

3. Ааааа, кстати, спасибо, чувак