Гугл фильтр из списка - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь отфильтровать элементы из списка arraylist с помощью фильтра Google Guava, и он поддерживает только Collection E.Мне нужно отфильтровать элементы из List of ArrayLists.

. Пожалуйста, найдите мой код ниже, который работает для него.

Есть ли какое-либо решение для фильтрации элементов из List of Arraylists?

ArrayList<ArrayList<String>> lists=new ArrayList<ArrayList<String>>();

    ArrayList<String> list1 = new ArrayList<String>();
    ArrayList<String> list2 = new ArrayList<String>();
    ArrayList<String> list3 = new ArrayList<String>();

    list1.add("Hello");
    list1.add("hi");
    list1.add("howdy");

    list2.add("are you good");
    list2.add("you doing");
    list2.add("was the day");

    list3.add("who");
    list3.add("how");
    list3.add("where");

    lists.add(list2);
    lists.add(list1);
    lists.add(list3);

    Collection<String> filtered=Collections2.filter(lists, Predicates.containsPattern("dy")); // not able to filter from List of ArrayLists.
    System.out.println("Filtered -->"+filtered);

Обновление 1

Пожалуйста, найдите мою реализацию ниже:

 Collection<Menu> menus = menuRepository.getMenus();

 Collection<ArrayList<Menu>> enabledMenus = FluentIterable.from(menus)
        .transformAndConcat(Functions.identity())
        .filter(byDisabled())
        .toList();

Получаю приведенную ниже ошибку

The method transformAndConcat(Function<? super Menu,? extends Iterable<? extends T>>) in the type FluentIterable<Menu> is not applicable for the arguments (Function<Object,Object>)

Пожалуйста, найдите мойbyDisabled() Реализация метода ниже.

  private Predicate<ArrayList<ArrayList<Menu>>> byDisabled() {
    return new Predicate<ArrayList<ArrayList<Menu>>>() {
      @Override
      public boolean apply(ArrayList<ArrayList<Menu>> menu) {
        return isMenuEnabled(menu);
      }
    };
  }

Ответы [ 3 ]

2 голосов
/ 10 июля 2019

(Предполагается, что вы не используете Java 8, в противном случае другие ответы уже показывают возможные решения.)

Вам необходим .flatMap эквивалент в Гуаве,которые:

Можно использовать последнийбегло (не очень), аналогично подходу Java 8:

ImmutableList<String> filtered = FluentIterable.from(lists)
        .transformAndConcat(Functions.identity())
        .filter(Predicates.containsPattern("dy"))
        .toList();

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

Iterable<String> filtered = FluentIterable.from(lists)
        .transformAndConcat(Functions.identity())
        .filter(Predicates.containsPattern("dy"));

Подробнее о Iterables и FluentIterable на Gauva wiki.

1 голос
/ 10 июля 2019

Не уверен, является ли guava единственным вариантом для вас, в противном случае может работать Java 8 stream:

Если вы хотите только найти подходящие элементы, попробуйте:

    ArrayList<ArrayList<String>> lists = new ArrayList<>();

    ArrayList<String> list1 = new ArrayList<>();
    ArrayList<String> list2 = new ArrayList<>();
    ArrayList<String> list3 = new ArrayList<>();

    list1.add("Hello");
    list1.add("hi");
    list1.add("howdy");

    list2.add("are you good");
    list2.add("you doing");
    list2.add("was the day");

    list3.add("who");
    list3.add("how");
    list3.add("where");

    lists.add(list2);
    lists.add(list1);
    lists.add(list3);

    List<String> matchedItems =
            lists.stream().flatMap(Collection::stream).filter(str -> str.contains("dy")).collect(Collectors.toList());

    for (String item : matchedItems) {
        System.out.println("Matched item: " + item);
    }

Обратите внимание, в этом решении связь между элементом и подсписком теряется.

1 голос
/ 10 июля 2019

Для этого вы можете использовать собственный потоковый API Java 8

List<String> filtered = lists.stream()
    .flatMap(Collection::stream)
    .filter(Predicates.containsPattern("dy"))
    .collect(Collectors.toList());
...