如何在文件中对数值进行排序

时间:2015-01-31 19:23:57

标签: java sorting file-io

我在文件

中以这种方式输入

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

我希望在#之后对值进行排序,要求ans应该采用以下格式

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

1 个答案:

答案 0 :(得分:0)

要在Java中读取“行”文件,您可以使用Files类,如下所示:

final List<String> l = 
        Files.readAllLines(Paths.get("/some/path/input.txt"));

这会读取文件并将每一行存储在List中。如果您拥有ListString个对象,则可以使用简单的ComparatorCollections.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的JavaDoc可以是found here

请注意,此解决方案使用了一些Java 8功能。如果使用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 Streams。您可以将其与新的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类可以解决问题:

Files.write(
        Paths.get("/some/path/output.txt"),
        sorted);

您可以使用write方法写出任何Iterable对象,例如您刚排序的List