如何在过滤之后或之前对元素进行排序

时间:2015-09-11 13:37:11

标签: java arraylist collections java-8 java-stream

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包含路径元素列表。元素未排序。我希望按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是ID。

2 个答案:

答案 0 :(得分: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();
}

它会:

  • 使用ID在授权ID列表中的元素过滤给定列表
  • 根据id按升序对流进行排序
  • 返回
  • 的列表

这是基于给定路径总是这样的事实:/src/resource/files/{id}/212_Hello.txt

答案 1 :(得分:1)

这不是分组本身,分组意味着将唯一ID映射到路径。我认为你需要的是两个集合。像这样的东西

 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());