-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
Andreas
  • 154,647
  • 11
  • 152
  • 247
alge124
  • 19
  • 3
  • 1
    well, that breaks down to [reading](https://stackoverflow.com/questions/5343689/java-reading-a-file-into-an-arraylist) a file into a List and then apply a [custom sort](https://stackoverflow.com/questions/2784514/sort-arraylist-of-custom-objects-by-property) on it. – Curiosa Globunznik Nov 12 '20 at 19:14
  • and perhaps writing it back to a file. – Curiosa Globunznik Nov 12 '20 at 19:22

1 Answers1

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.

swpalmer
  • 3,890
  • 2
  • 23
  • 31