2015-09-11 2 views
3
public List<Path> removeUnwantedPaths(List<Path> listofPaths, List<String> ids) { 
    List<Path> entries; 
    entries = listofPaths.stream() 
      .filter(p -> ids.contains(p.getParent().getFileName().toString())) 
      .collect(Collectors.toList()); 

    return entries; 
} 

entries содержит список элементов пути. Элементы не сортируются. Im ищет их отсортированные по ids по электронной почте p.getParent().getFileName().toString(), чтобы список был организован и отсортирован перед возвращением коллекции. Как я могу использовать Java 1.8 groupingBy() для группировки коллекции? Так что если мой список содержит следующие элементы первоначально:Как отсортировать элементы после или до фильтрации

212_Hello.txt 
312_Hello.txt 
516_something.xml 
212_Hello.xml 

Я хочу, чтобы этот список должен быть организован как:

212_Hello.txt 
212_Hello.xml 
312_Hello.txt 
516_something.xml 

где 212, 312, 516 являются идентификаторами.

+3

Ваш вопрос непонятен? Вы хотите вернуть 'Map >'? если нет, как вы можете группировать элементы в списке? Если вы просто не хотите сортировать элементы (а не группировать их)? – assylias

+0

Так что идентификаторы являются именами родителей? –

+0

да, так что файловые пути похожи на это '/ src/resource/files/212/212_Hello.txt' – user2781389

ответ

2

Ниже будет делать:

public static List<Path> removeUnwantedPaths(List<Path> listofPaths, List<String> ids) { 
    return listofPaths.stream() 
      .filter(p -> ids.contains(getIdFromPath(p))) 
      .sorted(Comparator.comparing(p -> getIdFromPath(p))) 
      .collect(Collectors.toList()); 
} 

private static String getIdFromPath(Path p) { 
    return p.getParent().getFileName().toString(); 
} 

Он будет:

  • фильтр данный список с элементами, имеющими идентификатор, который в данном списке разрешенных идентификаторов
  • сортировать поток в соответствии с идентификатором в порядке возрастания
  • вернуть список что

Он основан на том, что данные пути всегда бывают такими: /src/resource/files/{id}/212_Hello.txt.

1

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

List<Path> entries; 
entries = listofPaths.stream() 
      .filter(p -> ids.contains(p.getParent().getFileName().toString())) 
      .map(p -> p.getParent().getFileName() + "_" +p.getFileName()) 
      .sorted(String::compareTo) 
      .map(Paths::get) 
      .collect(Collectors.toList()); 
Смежные вопросы