在Java中按降序排序2D字符串数组并将其写入文件

时间:2017-04-26 18:48:40

标签: java arrays string sorting

所以我必须从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();
        }
    }

所以,这段代码基本上将得分和名称写在2D数组中,如下所示:

得分[0] [0] =" 24&#34 ;;
得分[0] [1] ="基利安&#34 ;;

得分[1] [0] =" 33&#34 ;;
得分[1] [1] ="姓名&#34 ;;

得分[2] [0] =" 45&#34 ;;
得分[2] [1] =" AnotherName&#34 ;;

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

4 个答案:

答案 0 :(得分:0)

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

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));

答案 1 :(得分:0)

我建议您制作一个新的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

答案 2 :(得分:0)

您可以使用java.util.Arrays&#39; s sort - 方法:

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

但这会导致&#34; 3&#34;将高于&#34; 23&#34;。所以你可能应该创建一个保存值的新类并使用一个ArrayList

答案 3 :(得分:0)

你可以尝试一下:

 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 ));