2017-01-05 9 views
1

私の最初のJavaゲームのコードを今書いていますが、ArrayListに問題があります。私は、テキストファイル(以下コード)からそれを作る具体的には、ニックネームとスコアのような要素で、次のいずれかを持っている:新しいArrayListを別の要素から作成する

static ArrayList<String> results = new ArrayList<String>(); 
BufferedReader br = new BufferedReader(new FileReader(ranking)); 
     String line = br.readLine(); 
     results.add(line); 

while(line != null) { 
    line = br.readLine(); 
    results.add(line); 
} 

br.close(); 

だから、ファイルは次のようになります。

nick1 
score1 
nick2 
score2 
... 

を私は希望します私の考えは、フィールドnickとscoreを持つクラスを作成し、そのフィールドを何らかの方法でArrayListの魅力的なものに割り当てます。たぶん私はこの:(ようにこれを行うことができますか?)

for(int i = 0;i<results.size();i=i+2){ 
    nick = results.get(i); 
} 

for(int i = 1;i<results.size();i=i+2){ 
    score = results.get(i); 
} 

それから私は、その新しいクラスの型になり、新たなArrayListを作成します。しかし、私の問題は、私が「古い」ArrayListの値を、将来のタイプの新しいパラメータArrayListとどのように関連付けることができないのかということです。新しいものは次のようになります:

static ArrayList<Ranking> resultsAfterModification = new ArrayList<Ranking>(); 
Ranking rank = new Ranking(nick, score); 

次に、私はプレイヤーの得点を簡単に比較し、確実な順位をつけることができます。あなたはファイル内の配列を保存することができます

+0

なぜArrayListを使用していますか?それの代わりにHashMapを使用してください。キーの値のペア(例:nickname1 = score1、nickname2 = score2.soなど)は、it.sortingに対して操作を追加、削除します。 –

答えて

2

内部の値をソートするために、独自のコンパレータを作成する必要があります。あなたがPlayerクラスを作成したら、あなたは一度に名前とスコアの両方を読むことができます

public class Player implements Comparable<Player> 
{ 
    private String _name; 
    private double _score; 

    public Player(String name, double score) 
    { 
     this._name = name; 
     this._score = score; 
    } 

    public String getName() 
    { 
     return this._name; 
    } 

    public double getScore() 
    { 
     return this._score; 
    } 

    // Since you probably want to sort the players in 
    // descending order, I'm comparing otherScore to this._score. 
    @Override 
    public int compareTo(Player otherScore) 
    { 
     return Double.compare(otherScore._score, this._score); 
    } 

    @Override 
    public String toString() 
    { 
     return "Name: " + this._name + ", Score: " + Double.toString(this._score); 
    } 
} 

Playerクラスには、コレクション内の要素の論理的な順序を考え出すのJavaの方法ですComparableインタフェースを実装する必要がありますCollectionsユーティリティクラスを使用してPlayerリストをソートします。少なくとも最後にではなく、あなたはsubListメソッドを使用してトップ10をつかむことができます:(このファイルは、それぞれの名前のスコアを持つことになりますし、ファイルには、上記の指定された形式になりますことを想定)

public static void main(String[] args) 
{ 
    List<Player> results = new ArrayList<Player>(); 
    BufferedReader br; 
    try 
    { 
     br = new BufferedReader(new FileReader("myFile.txt")); 
     String line = br.readLine(); 
     while(line != null) 
     { 
      String name = line; 
      double score = Double.parseDouble(br.readLine()); 
      results.add(new Player(name, score)); 
      line = br.readLine(); 
     } 
     br.close(); 
    } 
    catch (FileNotFoundException e) 
    { 
     e.printStackTrace(); 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 

    // Sort using the java.util.Collections utility class 
    // Sorting will modify your original list so make a copy 
    // if you need to keep it as is. 
    Collections.sort(results); 
    // Top 10 
    List<Player> top10 = results.subList(0, 10); 
} 
+0

'List.subList()'メソッドでは、2番目のパラメータ:toIndexは排他的です。トップ10を持つためには、 'results.subList(0、10)'と書くべきです。それ以外はトップ9です。 – davidxxx

+0

ありがとう!それが私が探していたものです。今、そのリストをJLabelにどのように表示できますか?これは残念ながら修正されていません: JLabel PlayersRanking = new JLabel(); (プレイヤーp:トップ10){ \t \t \t PlayersRanking.setText(String.valueOf(p)); \t} – JeffTheKiller

+0

@JeffTheKiller私はスイングに精通していません。私がやった仕事の99%はバックエンドか数値的なものです。私はこのチュートリアルhttps://www.tutorialspoint.com/swing/swing_jlabel.htmを見て、それが始まる場所のように見えます。あなたはいつも別の質問を投稿できます。 – StaticBeagle

0

1を使用し、FileInputStramとFileOuputStreamは、ファイルに配列オブジェクトを読み書きします。以下のような通常のテキストファイルとして

3の書き込みを保存し、JSONなどの負荷アレイに

2使用Gsonライブラリ: プレイヤー1
スコアは1
プレーヤー2
は2 スコア....

ArrayList<Player> list=new ArrayList(); 
Scanner sc=new Scanner(new File("filepath.txt")); 
While(sc.hasNextLine()){ 
    Player p=new Player(); 
    p.name=sc.nextLine(); 
    If(sc.hasNextFloat()){ 
    p.score=sc.nextFloat(); 
    list.add(p); 
    } 
} 
Arrays.sort(list,...); 

配列をArrays.sort()で並べ替えることができます

1

1)Y ArrayListに固有のメソッドを使用していないため、ここではInterface(ArrayListの代わりにListを宣言型ではなく)でプログラムする必要があります。

List<Ranking> resultsAfterModification = new ArrayList<Ranking>(); 

2)

は、その後、私は 新しいクラスの型になり、新しいのArrayListを、作成します。しかし、私の問題は、私がどのようにして の値を新しいArrayListの将来のタイプののパラメタと '古い' ArrayListから接続できるのか正確にはわからないということです。

これを行うには、多くの変更を加える必要はありません。あなたがStringListに読み出しラインから格納する1つ、あなたがRankingListStringListから保存し、別の1:最後に、あなたが2つのマッピングを行うため あなたのアイデアaは少し複雑すぎます。
Listの地図の読み取り行をRankingにすることができます。

List<Ranking> rankings = new ArrayList<Ranking>(); 
    BufferedReader br = new BufferedReader(new FileReader(ranking)); 

    String nick = null; 
    while ((nick = br.readLine()) != null){ 
      String score = br.readLine(); 
      rankings.add(new Ranking(nick, score)); 
     } 
0

だからあなたRankingクラスは、私がnickscoreはそれぞれニックとスコアを含む2 ArrayListだと思う

public class Ranking { 
    public String nick; 
    public int score; 
} 

のように見えるかもしれません。

共通のArrayListを作成する場合は、nickscoreのサイズが同じ場合は、次のようなことが考えられます。

static ArrayList<Ranking> resultsAfterModification = new ArrayList<Ranking>(); 
for(int i = 0; i < nick.size(); i++) { 
    Ranking rank = new Ranking(nick.get(i), score.get(i)); 
    resultsAfterModification.add(rank); 
} 

今、あなたはあなたが各プレイヤーの名前とスコアを含むクラスPlayerを作成することができますresultsAfterModification

Collections.sort(resultsAfterModification, new Comparator<Ranking>() { 
    @Override 
    public int compare(Ranking r1, Ranking r2) { 
     if (r1.score > r2.score) 
      return 1; 
     if (r1.score < r2.score) 
      return -1; 
     return 0; 
    } 
}); 
+0

比較すると、単にr1.score-r2.scoreを返すことができます。 –

関連する問題