如何根据 Java 中多个路径的文件名对文件进行分组

How to group files based on filenames from multiple paths in Java

我想根据来自多个路径的文件名对特定文件进行分组。我关注了这个 Whosebug 。在开始流式传输路径以查找特定文件名后,我无法遍历每个文件。

以下是包含文件内容的路径:

/var/tmp/data_sample1/data2_first_example.set.csv
/var/tmp/data_sample1/data3_first_example.set.csv
/var/tmp/data_sample1/data1_first_example.set.csv
/var/tmp/data_sample2/data2_second_example.set.csv
/var/tmp/data_sample2/data1_second_example.set.csv
/var/tmp/data_sample2/data3_second_example.set.csv
/tmp/csv_files/data_sample3/data2_third_example.set.csv
/tmp/csv_files/data_sample3/data1_third_example.set.csv
/tmp/csv_files/data_sample3/data3_third_example.set.csv

枚举Class:

enum PersonType {
    A,
    B
}

FileName.java

import java.util.Arrays;
import java.util.List;

public class FileName {
    private final String first = "_first_sample";
    private final String second = "_second_sample";
    private final String third = "_third_sample";

    private final List<String> filenames = Arrays.asList(first, second, third);
    public List<String> getFilenames() {
        return filenames;
    }
}

CSVFiles.java

import java.io.File;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;
import java.util.stream.Collectors;

public class CSVFiles {

    private PersonType personType;
    private List<String> fileNames = new ArrayList<>();
    private List<File> firstSample = new ArrayList<>();
    private List<File> secondSample = new ArrayList<>();
    private List<File> thirdSample = new ArrayList<>();

    public CSVFiles(PersonType personType, List<String> paths) {
        if (personType == PersonType.A) {
            this.personType = personType;
            FileName fileName = new FileName();
            this.fileNames = fileName.getFilenames();
            setCSVFiles(paths);
        }
    }

    public List<File> setCSVFiles(List<String> paths) {
        List<Path> collect = paths.stream()
                .flatMap(path -> {
                    try {
                        return Files.find(Paths.get(path), Integer.MAX_VALUE,
                                (p, attrs) -> attrs.isRegularFile()
                                        && p.toString().contains(".set")
                                        && p.toString().endsWith(".csv")
                        );
                    } catch (IOException ex) {
                        throw new UncheckedIOException(ex);
                    }
                }).collect(Collectors.toList());

        return collect.stream()
                .map(Path::toFile)
                .filter(file -> {
                    if (file.getName().contains("_first_sample")) {
                        firstSample.add(file);
                        return true;
                    } else if (file.getName().contains("_second_sample")) {
                        secondSample.add(file);
                        return true;
                    } else if (file.getName().contains("_third_sample")) {
                        thirdSample.add(file);
                        return true;
                    }
                    return false;
                })
                .collect(Collectors.toList());
    }
}

CSVFilesTest.java

import org.junit.Test;

import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.*;

public class CSVFilesTest {

    @Test
    public void test() {
        String data_sample1 = "/var/tmp/data_sample1";
        String data_sample2 = "/var/tmp/data_sample2";
        String data_sample3 = "/tmp/csv_files/data_sample3";
        List<String> paths = Arrays.asList(data_sample1, data_sample2, data_sample3);
        System.out.println(paths);

        CSVFiles csvFiles = new CSVFiles(PersonType.A, paths);
    }
}

期望的输出:

firstSample: [data1_first_example.set.csv, data2_first_example.set.csv, data3_first_example.set.csv] 
secondSample: [data1_second_example.set.csv, data2_second_example.set.csv, data3_second_example.set.csv]
thirdSample:  [data1_third_example.set.csv, data2_third_example.set.csv, data3_third_example.set.csv]

欢迎任何反馈!

感谢“同步”评论的解决方案:

    public Map<String, List<String>> setCSVFiles(List<String> paths) {
        List<Path> collect = paths.stream()
                .flatMap(path -> {
                    try {
                        return Files.find(Paths.get(path), Integer.MAX_VALUE,
                                (p, attrs) -> attrs.isRegularFile()
                                        && p.toString().contains(".set")
                                        && p.toString().endsWith(".csv")
                        );
                    } catch (IOException ex) {
                        throw new UncheckedIOException(ex);
                    }
                }).collect(Collectors.toList());

        return collect.stream()
                .map(Path::toString)
                .collect(Collectors.groupingBy(path ->
                        path.substring(path.lastIndexOf("/")+1)
                        ));
    }