我有一个以下格式的文件,
Johnny|10|9|6
Smith|1|6|5
Mani|5|3|4
Someone|11|2|12
John|6|10|11
所以,我想用Java对这个文件进行排序,我可以使用下面的代码来完成
public class FileComparision {
public static void main(String[] args) throws IOException {
String inputFile = "C:\\testFile\\result1.txt";
FileReader fileReader = new FileReader(inputFile);
BufferedReader bufferedReader = new BufferedReader(fileReader);
String inputLine;
List<String> lineList = new ArrayList<String>();
while ((inputLine = bufferedReader.readLine()) != null) {
lineList.add(inputLine);
}
fileReader.close();
Collections.sort(lineList);
}
}
The output will be
John|6|10|11
Johnny|10|9|6
Mani|5|3|4
Someone|11|2|12
Smith|1|6|5
因此,代码工作正常,但对此问题的回答是,我想将此文件在不同的列上排序,因为它是|
分隔符列,所以我想使用第二个或是第三位还是第四位(取决于用户输入),有什么办法可以实现呢?例如,如果用户希望将第三列用作排序主键,则整个文件的结果将不同于正常结果。
答案 0 :(得分:2)
只需创建一个代表您的输入的模型类(我不确定这些值的含义,所以我只是将它们称为a,b和c-确实建议使用一些有意义的命名方式):
public class Person implements Comparable<Person>{
private String name;
private int a;
private int b;
private int c;
public Person(String[] input){
if(input.length < 4)
throw new IllegalArgumentException("Invalid input size!");
name = input[0];
// note: will throw an Exception if the values cannot be represented as ints
a = Integer.parseInt(input[1]);
b = Integer.parseInt(input[2]);
c = Integer.parseInt(input[3]);
}
public String getName() {
return name;
}
public int getA() {
return a;
}
public int getB() {
return b;
}
public int getC() {
return c;
}
@Override
public int compareTo(@NonNull Person another) {
// could be any other property as well
return Integer.compare(this.a, another.a);
然后只需使用String
将输入拆分为inputLine.split("\\|")
数组并创建一个ArrayList<Person>
,然后在其上调用Collections.sort(yourList)
。如果您需要其他指导,请随时发表评论。
编辑:正如azro所指出的那样,默认比较器只会按字母顺序对字符串进行排序,请检查String source code line 1140以获得详细信息。因此,您不能依靠Java来正确比较某些表示为String的任意类型。
答案 1 :(得分:1)
您可以创建一个代表4个元素的类,或者仅使用列索引进行比较
int columnToSort = 2; // between 0 and 3; because it's array index
Collections.sort(l, (o1, o2) -> {
String[] line1 = o1.split("\\|");
String[] line2 = o2.split("\\|");
if(line1.length !=4 || line2.length !=4)
throw new IllegalArgumentException("One line has not the expected size");
if(line1[columnToSort].matches("\\d+))
return Integer.compare(Integer.parseInt(line1[columnToSort]),
Integer.parseInt(line2[columnToSort]));
else
return line1[columnToSort].compareTo(line2[columnToSort]);
});
注意:
if+throw
行是完全可选的。