2017-04-26 4 views
0

Javaのファイルから文字列を読み出す必要があります。それは最高得点システムです。 ファイルの各行には、「24/Kilian」のようなものが含まれています。 /の前の数字はスコアで、/の後のテキストは名前です。Javaの2D文字列配列を降順にソートしてファイルに書き込む

私の問題は、降順でスコアを並べ替えてファイルに書き戻す必要があることです。新しいスコアは古いスコアを上書きする必要があります。

私は試しましたが、正しく動作させることができません。 私はすでにファイルからスコア+名前を1行ずつ読み出すコードを書いています。

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

したがって、このコードは、基本的に、このような2次元配列におけるスコアと名前を書き込む:

スコア[0] [0] = "24";
score [0] [1] = "Kilian";

スコア[1] [0] = "33";
スコア[1] [1] = "名前";

スコア[2] [0] = "45";
score [2] [1] = "AnotherName";

誰かが私の問題を助けてくれることを願っています。

+1

ていますか? 2d配列の代わりに –

+1

を使用する場合は、カスタムクラスの1次元配列を使用する必要があります。これは物事をより簡単にするでしょう。 –

+0

宿題に2D配列を使用する必要がない場合は、HashMapを使用して、キー(スコア)に基づいてコレクションを降順で並べ替えます。常に部分文字列/索引の検索を避けるようにしてください。 'split'を使用してください。 – jiveturkey

答えて

0

使用は、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)); 
+0

これは、リストを昇順にソートします。戻り値を無効にしても問題ありません。さて、私はInteger.parseInt()を使用します。なぜなら、Kilianはいくつかの整数しか扱っていないからです。 – Obenland

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 
+0

おそらく、 's2.getScore() - s1.getScore()'を試してみる必要があります... – Armin

0

あなたはjava.util.Arrayssort方法 - を使用することができます。

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

しかし、 "3" は、上記 "23" になるという場合には、このリード。だから、おそらくあなたは値を保持して新しいクラスを作成して使用する必要がありArrayListの

0

あなたはそれを試すことができます:あなたはあなたのコードが `NullPointerException`を上げることを意識

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)); 
関連する問題