【发布时间】:2017-11-02 21:09:30
【问题描述】:
我的任务是对文本文件进行排序,但有一些要求:
- 按列对行进行排序
- 按第一列对行进行排序(如果列中的数据相同,则按第二列)等。排序后行中的数据保持不变;
- 数字必须按升序排列,字母按字母顺序排列,数字比字母高
- 用制表符 ("\t") 分隔的列
我做了什么: 读取文件并将所有内容复制到 List>,其中 List 的每个元素都是存储在 List 中的文件的行,这里是代码:
public class ReadDataFile {
public static List<List<String>> readData(String fileName) throws IOException {
BufferedReader br = new BufferedReader(new FileReader(fileName + ".txt"));
List<List<String>> data = new ArrayList<List<String>>();
String line;
while (true) {
line = br.readLine();
if (line == null)
break;
List<String>lines = Arrays.asList(line.split("\t"));
data.add(lines);
System.out.println(lines);
}
br.close();
return data;
并将数据写入另一个文件:
public void writeToFile(String fileName) throws IOException {
FileWriter writer = new FileWriter(fileName);
List<List<String>> data = ReadDataFile.readData("input");
Collections.sort(data, new Comparator<List<String>>() {
@Override
public int compare(List<String> o1, List<String> o2) {
// TODO Auto-generated method stub
return o1.get(0).compareTo(o2.get(0));
}
});
for (List<String> lines : data) {
for (int i = 0; i < lines.size(); i++) {
writer.write(lines.get(i));
if (i < lines.size() - 1) {
writer.write("\t");
}
}
writer.write("\n");
}
writer.close();
}
问题是:
public int compare(List<String> o1, List<String> o2) {
// TODO Auto-generated method stub
return o1.get(0).compareTo(o2.get(0));
}
没有正确排序我需要的东西。
有输入文件的例子:
-2.2 2 3 4 329 2
2.2 12345q 69 -afg
2.2 12345q 69 -asdf
-22 1234234 asdfasf asdgas
-22 11 abc
-22 -3 4
-1.1
qqqq 1.1
最终预期输出是:
-22 -3 4
-22 11 abc
-22 1234234 asdfasf asdgas
-2.2 2 3 4 329 2
-1.1
2.2 12345q 69 -afg
2.2 12345q 69 -asdf
qqqq 1.1
但是,我得到的是:
-1.1
-2.2 2 3 4 329 2
-22 -3 4
-22 11 abc
-22 1234234 asdfasf asdgas
2.2 12345q 69 -afg
2.2 12345q 69 -asdf
qqqq 1.1
问题是,如何写出正确的排序?感谢您的回答
【问题讨论】:
-
您的问题不是对列表进行排序,而是比较包含数字的字符串并期望比较的行为就像它们是数字一样,即比较字符串时
"2"大于"10",因为字符是比较并且'2'大于'1'(同样"-22"大于"-2.2"因为'2'和'.'是比较的)。您必须解析字符串以进行数字比较(并检查它们是否是数字)。 -
你可以使用Collections.sort,请看这个链接stackoverflow.com/questions/6957631/sort-java-collection
-
@DavidHackro 他已经在使用它了:
Collections.sort(data, new Comparator<List<String>>() { ... }。 -
S比C高,因此它排序。说 “数字高于字母” 意味着数字在 字母之后排序,但您的示例恰恰相反。请澄清语言。另外,字母排序是否区分大小写?重音字母呢?您是否想根据某种语言进行排序,例如在德语中,ü与u排序? -
您并没有完全告诉我们您希望排序如何工作。通过查看您的预期输出,您期望数字字符串值被排序为数字而不是字符串。如果是这种情况,那么在比较器中,您需要检查字符串是否为数字,将其解析为 Number 并将它们作为数字进行比较。其次,您没有检查 compareTo 是否返回 0,这意味着第一列值相同,然后返回第二列比较。