-1

I have a .txt file that i wanna sort that looks like this :

GENEBOI INC COM 15893X590   46,741  174,700 SH      DFND    4,11    174,700 0   0
DCHATRA RESTAURATION GROUP INC N    CL A    14771P827   2,659,074   5,213,461   SH      DFND    4,8,11 5,213,461    0   0
FROLAKATZ CO    COM 107393852   35,744  800,000 SH      DFND    4   800,000 0   0

I want to sort every line where the second number in each line is the only important thing for the sort algorithm. I wanna sort them from the highest (e.g. 2,659,074) to the lowest(e.g. 35,744). The important part is that every line's content should not get edited or mixed up with other lines.

So the result should look like this:

DCHATRA RESTAURATION GROUP INC N    CL A    14771P827   2,659,074   5,213,461   SH      DFND    4,8,11 5,213,461    0   0
GENEBOI INC COM 15893X590   46,741  174,700 SH      DFND    4,11    174,700 0   0
FROLAKATZ CO    COM 107393852   35,744  800,000 SH      DFND    4   800,000 0   0
4

1 回答 1

1

Assuming tab-delimited records, it would be something like this:

public static void main(String[] args) throws Exception {
    if (args.length < 2) {
        System.out.println("Missing input and output filenames.");
        return;
    }
    List<String> lines = Files.readAllLines(Path.of(args[0]), StandardCharsets.UTF_8);
    NumberFormat nf = NumberFormat.getInstance();
    Collections.sort(lines, new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            String[] f1 = o1.split("\t");
            String[] f2 = o2.split("\t");
            if (f1.length >= 3 && f2.length >= 3) {
                try {
                    Number n1 = nf.parse(f1[2]);
                    Number n2 = nf.parse(f2[2]);
                    return Long.compare(n2.longValue(), n1.longValue());
                } catch (ParseException ex) {
                    // ignored
                }
            }
            return 0;
        }
    });
    Files.write(Path.of(args[1]), lines, StandardCharsets.UTF_8,
            StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
}

run with <input_file> <output_file> as arguments.

于 2020-11-12T19:56:25.537 回答