简体   繁体   English

如何使用文件中的特定列对排名列表进行排序并打印排序后的整个文件?

[英]How can I sort a Ranking list using a specific column from a file and print the whole file sorted?Java

Already done this but can't make it work. 已经完成了此操作,但无法使其正常工作。

Also tried to create another while ((line = br.readLine()) != null) {}, and placed the sort before it, but it won't read this while so it wouldnt print anithing. 还尝试创建另一个while((line = br.readLine())!= null){},并将排序放在它的前面,但是它不会读到它,因此不会打印。

The file looks like this: 该文件如下所示:

    1-Fred-18-5-0

    2-luis-12-33-0

    3-Helder-23-10-0

And wanted it to print like this: 并希望它像这样打印:

    2-luis-12-33-0

    3-Helder-23-10-0

    1-Fred-18-5-0

public static void lerRanking() throws IOException {
        File ficheiro = new File("jogadores.txt");

        BufferedReader br = new BufferedReader(new FileReader(ficheiro));
        List<Integer> jGanhos = new ArrayList<Integer>();
        int i = 0;
        String line;
        String texto = "";

        while ((line = br.readLine()) != null) {

            String[] col = line.split("-");
            int colunas = Integer.parseInt(col[3]);
            jGanhos.add(colunas);

            i++;
            if(i>=jGanhos.size()){
                Collections.sort(jGanhos);
                Collections.reverse(jGanhos);
                for (int j = 0; j < jGanhos.size(); j++) {
                    if(colunas == jGanhos.get(i)){
                        texto = texto + line + "\n";    
                    }
                }
            }
        }    
        PL(texto);
}

Make it step by step: 逐步进行:

public static void lerRanking() throws IOException {
    File ficheiro = new File("jodagores.txt");

    // read file
    BufferedReader br = new BufferedReader(new FileReader(ficheiro));
    List<String> lines = new ArrayList<>();
    String line;
    while ((line = br.readLine()) != null) {
        lines.add(line);
    }

    // sort lines
    lines.sort(new Comparator<String>() {
        @Override
        public int compare(String s1, String s2) {
            // sort by 3rd column descending
            return Integer.parseInt(s2.split("-")[3]) - Integer.parseInt(s1.split("-")[3]);
        }
    });

    // concat lines
    String texto = "";
    for (String l : lines) {
        texto += l + "\n";
    }

    System.out.println(texto);

    // PL(texto);

}

The easiest way is to first create a class that will hold the data from your file provided your lines keep the same format 最简单的方法是首先创建一个类,该类将保存文件中的数据,只要您的行保持相同的格式

public class MyClass {

  private Integer column1;
  private String column2;
  private Integer column3;
  private Integer column4;
  private Integer column5;

  public MyClass(String data) {
    String[] cols = data.split("-");
    if (cols.length != 5) return;

    column1 = Integer.parseInt(cols[0]);
    column2 = cols[1];
    column3 = Integer.parseInt(cols[2]);
    column4 = Integer.parseInt(cols[3]);
    column5 = Integer.parseInt(cols[4]);
  }

  public synchronized final Integer getColumn1() {
    return column1;
  }

  public synchronized final String getColumn2() {
    return column2;
  }

  public synchronized final Integer getColumn3() {
    return column3;
  }

  public synchronized final Integer getColumn4() {
    return column4;
  }

  public synchronized final Integer getColumn5() {
    return column5;
  }

  @Override
  public String toString() {
    return String.format("%d-%s-%d-%d-%d", column1, column2, column3, column4, column5);
  }
}

Next you can get a list of your items like this: 接下来,您将获得如下所示的物品清单:

public static List<MyClass> getLerRanking() throws IOException {
  List<MyClass> items = Files.readAllLines(Paths.get("jogadores.txt"))
    .stream()
    .filter(line -> !line.trim().isEmpty())
    .map(data -> new MyClass(data.trim()))
    .filter(data -> data.getColumn4() != null)
    .sorted((o1, o2) -> o2.getColumn4().compareTo(o1.getColumn4()))
    .collect(Collectors.toList());

  return items;
}

This will read your whole file, filter out any blank lines, then parse the data and convert it to MyClass . 这将读取您的整个文件,过滤出所有空白行,然后解析数据并将其转换为MyClass

It will then make sure that column4 isn't null in the converted objects. 然后,将确保转换后的对象中的column4不为null。

Finally it will reverse sort the objects based off from the value in column 4 and create a list of those items. 最后,它将根据第4列中的值对对象进行反向排序,并创建这些项目的列表。

To print the results you can do something like this 要打印结果,您可以执行以下操作

public static void main(String[] args) {
   List<MyClass> rankingList = getLerRanking();
   rankingList.forEach(item -> System.out.println(item));
}

Since we overrode the toString() method, it will print it out the object as it is displayed in the file. 由于我们覆盖了toString()方法,因此它将按对象显示在文件中的方式将其打印出来。

Hope this helps. 希望这可以帮助。

Okay so first of all I thounk you should introduce a Java class (in my code this is ParsedObject ) to manage your objects. 好的,首先我应该介绍一个Java类(在我的代码中为ParsedObject )来管理对象。

Second it should implement the Comparable<ParsedObject> interface, so you can easily sort it from anywhere in the code (without passing a custom comparator each time). 其次,它应该实现Comparable<ParsedObject>接口,因此您可以轻松地从代码中的任何位置对其进行排序(而无需每次都传递自定义比较器)。

Here is the full code: 这是完整的代码:

import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main {

    public static void main(String[] args) throws IOException {
        lerRanking();
    }

    public static void lerRanking() throws IOException {
        File ficheiro = new File("jodagores.txt");
        // read lines to a list
        List<String> lines = readLines(ficheiro);
        // parse them to a list of objects
        List<ParsedObject> objects = ParsedObject.from(lines);
        // sort
        Collections.sort(objects);
        // print the output
        writeLines(objects);
    }

    public static List<String> readLines(File ficheiro) throws IOException {
        // read file line by line
        BufferedReader br = new BufferedReader(new FileReader(ficheiro));
        List<String> lines = new ArrayList<>();
        String line;
        while((line = br.readLine()) != null) {
            lines.add(line);
        }
        br.close(); // THIS IS IMPORTANT never forget to close a Reader :)
        return lines;
    }

    private static void writeLines(List<ParsedObject> objects) throws IOException {
        File file = new File("output.txt");
        BufferedWriter bw = new BufferedWriter(new FileWriter(file));
        for(ParsedObject object : objects) {
            // print the output line by line
            bw.write(object.originalLine);
        }
        bw.flush();
        bw.close();  // THIS IS IMPORTANT never forget to close a Writer :)
    }


    // our object that holds the information
    static class ParsedObject implements Comparable<ParsedObject> {

        // the original line, if needed
        public String originalLine;
        // the columns
        public Integer firstNumber;
        public String firstString;
        public Integer secondNumber;
        public Integer thirdNumber;
        public Integer fourthNumber;

        // parse line by line
        public static List<ParsedObject> from(List<String> lines) {
            List<ParsedObject> objects = new ArrayList<>();
            for(String line : lines) {
                objects.add(ParsedObject.from(line));
            }
            return objects;
        }

        // parse one line
        public static ParsedObject from(String line) {
            String[] splitLine = line.split("-");
            ParsedObject parsedObject = new ParsedObject();
            parsedObject.originalLine = line + "\n";
            parsedObject.firstNumber = Integer.valueOf(splitLine[0]);
            parsedObject.firstString = splitLine[1];
            parsedObject.secondNumber = Integer.valueOf(splitLine[2]);
            parsedObject.thirdNumber = Integer.valueOf(splitLine[3]);
            parsedObject.fourthNumber = Integer.valueOf(splitLine[4]);
            return parsedObject;
        }

        @Override
        public int compareTo(ParsedObject other) {
            return other.thirdNumber.compareTo(this.thirdNumber);
        }
    }
}

If you have any more question feel free to ask :) An here is an the example objects list after parsing and sorting. 如果您还有其他问题,请随时提问:)这是解析和排序后的示例对象列表。

示例运行的输出

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何使用 Java 以最优化的方式在大型排序文件中搜索特定数字/时间戳? - How can I search for a specific number/timestamp in a large sorted file in most optimized way using Java? 如何从 csv 文件中获取特定列并使用 java 将该列项放入 jComboBox? - How can i get specific column from csv file and put that items of column into jComboBox using java? 如何按 Java 中的特定列对 csv 文件进行排序 - How to sort a csv file by a specific column in Java 如何在不使用Collections.sort()的情况下获得Java中的排序列表行为? - How can I get Sorted List behavior in Java without using Collections.sort()? 如何按第一列对excel文件排序? 爪哇 - How can I sort excel file by the first column? java 如何在 Java 中创建具有排序字符串和特定 Integer 的列表? - How can I create a List with sorted Strings and a specific Integer in Java? 如何对文本文件中的记录进行排序以及如何使用 Java 打印其他 txt 文件? - How do I sort records in a text file and how to print other txt file using Java? 使用Java,如何列出和打印MS-Access 2003 mdb文件中的所有查询? - Using Java, How can I list and print all Queries in a MS-Access 2003 mdb file? Java文件列表未使用Comparator进行排序 - Java list of file not getting sorted using Comparator 如何使用 java 中的 2 个线程在文件中打印数据 - How can i print data in a file using 2 threads in java
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM