如何对文件中的数值进行排序
How to sort numeric value in file
我在文件中以这种方式输入
id1 0.44 0.5 #0.13800099498102508
id2 0.44 0.8 #0.22080159196964014
id3 0.44 0.5 #0.15771581712401433
id4 0.44 0.8 #0.22080159196964014
id5 0.11 0.5 #0.04353560295326771
id6 0.11 0.2 #0.017414241181307084
我想在 # 之后对值进行排序,要求答案应采用以下格式
id2 0.44 0.8 #0.22080159196964014
id4 0.44 0.8 #0.22080159196964014
id3 0.44 0.5 #0.15771581712401433
id1 0.44 0.5 #0.13800099498102508
id5 0.11 0.5 #0.04353560295326771
id6 0.11 0.2 #0.017414241181307084
要在 Java 中读取 "lines" 的文件,您可以像这样使用 Files
class:
final List<String> l =
Files.readAllLines(Paths.get("/some/path/input.txt"));
这会读取一个文件并将每一行存储在 List
中。当您拥有 List
of String
个对象时,您可以使用简单的 Comparator
和 Collections.sort
方法。检查此代码:
final List<String> l = Arrays.asList(
"id1 0.44 0.5 #0.13800099498102508",
"id2 0.44 0.8 #0.22080159196964014",
"id3 0.44 0.5 #0.15771581712401433",
"id4 0.44 0.8 #0.22080159196964014",
"id5 0.11 0.5 #0.04353560295326771",
"id6 0.11 0.2 #0.017414241181307084");
Collections.sort(l, new Comparator<String>() {
@Override
public int compare(final String o1, final String o2) {
return o1.substring(o1.indexOf("#") + 1).compareTo(o2.substring(o2.indexOf("#") + 1));
}
}.reversed());
l.forEach(System.out::println);
输出为:
id2 0.44 0.8 #0.22080159196964014
id4 0.44 0.8 #0.22080159196964014
id3 0.44 0.5 #0.15771581712401433
id1 0.44 0.5 #0.13800099498102508
id5 0.11 0.5 #0.04353560295326771
id6 0.11 0.2 #0.017414241181307084
Comparator
的 Java 文档可以是 found here。
请注意,此解决方案使用了一些 Java8 项功能。如果使用 pre Java 8,则可以使用以下比较器代替(注意 -
符号):
Comparator<String> c = new Comparator<String>() {
@Override
public int compare(final String o1, final String o2) {
return -o1.substring(o1.indexOf("#") + 1).compareTo(o2.substring(o2.indexOf("#") + 1));
}
};
另一种选择是使用 Java 8 个流。您可以像这样将它与新的 Comparator.comparing
方法结合起来:
final List<String> sorted = l.stream()
.sorted(
Comparator.<String, String>comparing(
(str) -> str.substring(str.indexOf("#")))
.reversed())
.collect(Collectors.toList());
请注意,这不会对原始 List
进行排序,而是创建一个新的排序 List
。
最后,为了再次将输出保存到文件中,Files
class 派上了用场:
Files.write(
Paths.get("/some/path/output.txt"),
sorted);
您可以使用 write
方法写出任何 Iterable
对象,例如您刚刚排序的 List
。
我在文件中以这种方式输入
id1 0.44 0.5 #0.13800099498102508
id2 0.44 0.8 #0.22080159196964014
id3 0.44 0.5 #0.15771581712401433
id4 0.44 0.8 #0.22080159196964014
id5 0.11 0.5 #0.04353560295326771
id6 0.11 0.2 #0.017414241181307084
我想在 # 之后对值进行排序,要求答案应采用以下格式
id2 0.44 0.8 #0.22080159196964014
id4 0.44 0.8 #0.22080159196964014
id3 0.44 0.5 #0.15771581712401433
id1 0.44 0.5 #0.13800099498102508
id5 0.11 0.5 #0.04353560295326771
id6 0.11 0.2 #0.017414241181307084
要在 Java 中读取 "lines" 的文件,您可以像这样使用 Files
class:
final List<String> l =
Files.readAllLines(Paths.get("/some/path/input.txt"));
这会读取一个文件并将每一行存储在 List
中。当您拥有 List
of String
个对象时,您可以使用简单的 Comparator
和 Collections.sort
方法。检查此代码:
final List<String> l = Arrays.asList(
"id1 0.44 0.5 #0.13800099498102508",
"id2 0.44 0.8 #0.22080159196964014",
"id3 0.44 0.5 #0.15771581712401433",
"id4 0.44 0.8 #0.22080159196964014",
"id5 0.11 0.5 #0.04353560295326771",
"id6 0.11 0.2 #0.017414241181307084");
Collections.sort(l, new Comparator<String>() {
@Override
public int compare(final String o1, final String o2) {
return o1.substring(o1.indexOf("#") + 1).compareTo(o2.substring(o2.indexOf("#") + 1));
}
}.reversed());
l.forEach(System.out::println);
输出为:
id2 0.44 0.8 #0.22080159196964014
id4 0.44 0.8 #0.22080159196964014
id3 0.44 0.5 #0.15771581712401433
id1 0.44 0.5 #0.13800099498102508
id5 0.11 0.5 #0.04353560295326771
id6 0.11 0.2 #0.017414241181307084
Comparator
的 Java 文档可以是 found here。
请注意,此解决方案使用了一些 Java8 项功能。如果使用 pre Java 8,则可以使用以下比较器代替(注意 -
符号):
Comparator<String> c = new Comparator<String>() {
@Override
public int compare(final String o1, final String o2) {
return -o1.substring(o1.indexOf("#") + 1).compareTo(o2.substring(o2.indexOf("#") + 1));
}
};
另一种选择是使用 Java 8 个流。您可以像这样将它与新的 Comparator.comparing
方法结合起来:
final List<String> sorted = l.stream()
.sorted(
Comparator.<String, String>comparing(
(str) -> str.substring(str.indexOf("#")))
.reversed())
.collect(Collectors.toList());
请注意,这不会对原始 List
进行排序,而是创建一个新的排序 List
。
最后,为了再次将输出保存到文件中,Files
class 派上了用场:
Files.write(
Paths.get("/some/path/output.txt"),
sorted);
您可以使用 write
方法写出任何 Iterable
对象,例如您刚刚排序的 List
。