在Java中对txt文件进行排序的最佳方法

Der*_*gan 1 java sorting

我有一个CSV文件,我正在使用opencsv库进行处理.所以我可以阅读每一行.我需要做的特定转换要求我在使用java文件的主要部分运行之前先对该文件进行排序.

例如

5423, blah2, blah
5323, blah3, blah
5423, blah4, blah
5444, blah5, blah
5423, blah6, blah
Run Code Online (Sandbox Code Playgroud)

应该成为

5323, blah3, blah
5423, blah2, blah
5423, blah4, blah
5423, blah6, blah
5444, blah5, blah
Run Code Online (Sandbox Code Playgroud)

等等..

我需要这样做的原因是我将具有相同id的所有行组合并将它们输出到新文件.

有什么不妥:

  1. 使用opencsv库读取csv的每一行

  2. 将它们添加到二维数组中

  3. 对此进行某种排序

  4. 循环排序数组并输出到文件.

关于此的任何其他想法以及对数据进行排序的最佳方法是什么?

我的Java上有点生锈.

更新:澄清最终输出

它看起来像:

5323, blah3, blah
5423, blah2!!blah4!!blah6, blah
5444, blah5, blah
Run Code Online (Sandbox Code Playgroud)

这是我正在做的非常简化的版本.实际上,JBase系统中的多选项字段需要它.这是请求的文件格式.

原始文件中有超过100,000行.

这将不止一次运行,它运行的速度对我来说很重要.

not*_*oop 5

为了完成最新的请求,我强烈建议Multimap在google集合中使用.您的代码如下所示:

CSVReader reader = ...;
CSVWriter writer = ...;

Multimap<String, String> results = TreeMultimap.create();

// read the file
String[] line;
for ((line = reader.readNext()) != null) {
    results.put(line[0], line[1]);
}

// output the file
Map<String, Collection<String>> mapView = results.asMap();
for (Map.Entry<String, Collection<String> entry : mapView.entries()) {
    String[] nextLine = new String[2];
    nextLine[0] = entry.getKey();
    nextLine[1] = formatCollection(entry.getValue());
    writer.writeNext(nextLine);
}
Run Code Online (Sandbox Code Playgroud)

你需要使用"blah\n"你的线路ender.如果您关心速度,而不是关于对条目进行排序,那么您也应该进行基准测试HashMultimap.

我以前的回答:

最直接的方法是使用sort*nix中的命令(例如Linux和Mac OS)

sort -n myfile.csv
Run Code Online (Sandbox Code Playgroud)

Windows也有一个sort命令,但是会按字母顺序对行进行排序(即"5",将放在"13"行之前).

但是,建议的解决方案没有任何问题.您也可以使用TreeSet,而不是构造数组并对其进行排序.

编辑:添加关于Windows的注释.