繁体   English   中英

用Java降序对2D字符串数组进行排序并将其写入文件

[英]Sorting a 2D string array in Java in descending order and writing it to a file

因此,我必须从Java文件中读取一个字符串。 这是一个高分系统。 文件的每一行都包含类似的内容:“ 24 / Kilian”。 /前面的数字是分数,/后面的文本是名称。

现在,我的问题是我必须对得分降序进行排序并将其写回到文件中。 新分数应覆盖旧分数。

我尝试过,但是无法正常工作。 我已经写了一些代码,从文件中逐行读取成绩+名称。

public static void sortScores() {
        String [][]scores = null;
        int i = 1;
        try (BufferedReader br = new BufferedReader(new FileReader("score.txt"))) {
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
                scores[i][0] = line.substring(0, line.indexOf("/"));
                scores[i][1] = line.substring(line.indexOf("/"), line.length());
                i++;
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

因此,这段代码基本上将分数和名称写在二维数组中,如下所示:

score [0] [0] =“ 24”;
score [0] [1] =“基里安”;

score [1] [0] =“ 33”;
score [1] [1] =“名称”;

score [2] [0] =“ 45”;
score [2] [1] =“ AnotherName”;

我希望有人可以帮助我解决我的问题。

将Arrays.sort(arr,比较器)与自定义比较器一起使用:

Arrays.sort(theArray, new Comparator<String[]>(){

    @Override
    public int compare(final String[] first, final String[] second){
        // here you should usually check that first and second
        // a) are not null and b) have at least two items
        // updated after comments: comparing Double, not Strings
        // makes more sense, thanks Bart Kiers
        return Double.valueOf(second[1]).compareTo(
            Double.valueOf(first[1])
        );
    }
});
System.out.println(Arrays.deepToString(theArray));

我建议您创建一个新class Score ,其中包含您的数据(分数+名称),并为您从文件中读取的每一行添加一个Score的新实例到ArrayList中。 之后,您可以实现Comparator并对ArrayList排序。 这很容易,因为您不知道字符串数组将变大,并且在使用数组时需要知道这一点。

public class Score {
    public Score(int score, String name) {
        this.score = score;
        this.name = name;
    }

    int score;
    String name;

    // getter
}


List<Score> scoreList = new ArrayList<>();
String line;
while ((line = br.readLine()) != null) {
    scoreList.add(new Score(Integer.parseInt(line.substring(0, line.indexOf("/"))), line.substring(line.indexOf("/"), line.length())));
}

Collections.sort(scoreList, new Comparator<Score>() {
    public int compare(Score s1, Score s2) {
        return s1.getScore() - s2.getScore();
    }
}

// write to file

您可以使用java.util.Arrayssort -Method:

Arrays.sort(scores, (a, b) -> -a[0].compareTo(b[0]));

但这导致“ 3”高于“ 23”的情况。 因此,您可能应该创建一个保存该值的新类并使用ArrayList

你可以试试:

 HashMap<Integer, String > map = new HashMap<>();

    try (BufferedReader br = new BufferedReader(new FileReader("score.txt"))) {
        String line;
        while ((line = br.readLine()) != null) {
            System.out.println(line);
            String[] lines = line.split("/");
            map.put(Integer.valueOf(lines[0]),lines[1]);
        }
        SortedSet<Integer> keys = new TreeSet<Integer>(map.keySet());
        keys.forEach(k -> System.out.println(map.get(k).toString() + " value " + k ));

暂无
暂无

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM