使用分隔列对文件排序

时间:2018-07-09 12:10:39

标签: java

我有一个以下格式的文件,

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

因此,代码工作正常,但对此问题的回答是,我想将此文件在不同的列上排序,因为它是|分隔符列,所以我想使用第二个或是第三位还是第四位(取决于用户输入),有什么办法可以实现呢?例如,如果用户希望将第三列用作排序主键,则整个文件的结果将不同于正常结果。

2 个答案:

答案 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行是完全可选的。
  • 使用另一个类可以得到更清晰的解决方案,但是您不需要帮助。