【问题标题】:Sorting a 2D string array in Java in descending order and writing it to a file在Java中按降序对二维字符串数组进行排序并将其写入文件
【发布时间】:2017-04-26 18:48:40
【问题描述】:

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

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

分数[0][0] = "24";
score[0][1] = "基利安";

分数[1][0] = "33";
score[1][1] = "姓名";

分数[2][0] = "45";
score[2][1] = "另一个名字";

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

【问题讨论】:

  • 你知道你的代码引发了NullPointerException吗?
  • 您应该使用自定义类的一维数组,而不是二维数组。这会让事情变得容易得多。
  • “我无法正常工作”还有什么更具体的吗?
  • @jnbbender 你假设没有两个玩家得分相同?
  • 你的索引必须从 0 开始,现在是 1

标签: java arrays string sorting


【解决方案1】:

可以使用java.util.Arrayssort-方法:

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

但这会导致“3”高于“23”的情况。所以可能你应该创建一个新的类来保存这个值并使用一个 ArrayList

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      你可以试试:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 这对列表进行升序排序。只需否定返回值就可以了。好吧,我会使用 Integer.parseInt() 因为 Kilian 只帽子一些整数。
        猜你喜欢
        • 2011-07-01
        • 2013-05-26
        • 1970-01-01
        • 1970-01-01
        • 2021-12-06
        • 1970-01-01
        • 1970-01-01
        • 2017-01-09
        • 2021-08-16
        相关资源
        最近更新 更多