【发布时间】:2022-01-13 23:34:48
【问题描述】:
我有一个名为filelist.txt 的服务器属性文件。此文件列表包含根据目录前缀分组排列的文件列表。内容的顺序很重要,因为文件必须以特定的文件名开始和结束,并且第一个子组必须首先出现。例如,文件如下所示:
config.txt
../../linux/a.txt
../../linux/c.txt
../../linux/d.txt
../../linux/b.txt
../../certificates/../../d.txt
../../certificates/../../a.txt
../../certificates/../../c.txt
../../certificates/../..b.txt
../../bin/b.txt
../../bin/a.txt
properties.server
我想知道的是,在保持子组的整体顺序的同时,以干净有效的方式在这些子组中进行排序的最佳方式是什么?
我编写了这段代码,它可以按子组过滤并对其进行排序:
try(Stream<String> lines = Files.lines(Paths.get("src/filelist.txt"))){
List<String> linez = lines.filter(l -> l.contains("linux")).sorted().collect(Collectors.toList());
BufferedWriter bw = new BufferedWriter(new FileWriter("src/output.txt"));
for(String line : linez){
bw.write(line+"\n");
}
bw.close();
我可以有一个List<String>,它将包含我的所有行,我可以过滤原始文件行,对它们进行排序,然后将它们添加到此列表中。
有几件事我不喜欢:
- 我没有覆盖原始文件,我正在写入一个新文件。我想看看是否有办法覆盖而不是写入新文件。
- 似乎有点迟钝。如果添加了新的目录前缀怎么办?然后我将不得不再次编辑此代码以过滤和排序新的目录前缀组。此外,根据每个过滤器为每个子组制作一堆不同的列表会感觉很奇怪,而不是像
lines.filter(...).sort().filter(...).sort().filter(...)这样的事情,但我认为这种语法还没有意义,因为一旦应用了过滤器,排序后我无法取消应用过滤器。能够过滤、就地排序,然后应用另一个过滤器和排序等等,真是太好了。
我有什么选择?
【问题讨论】:
标签: java sorting java-stream