2011-12-13 10 views
2

次のプログラムは、プレイヤーの数とその名前を質問します。私はarraylistに名前を入れて、彼らのidによってそれらを戻したいと思う。id-javaによる検索arraylist

私はidで検索を行う方法を知らない
private static ArrayList<Player>Playerlist=new ArrayList<Player>(); 

public static void main(String[] args) { 

    Scanner scanner = new Scanner(System.in); 
    String s; 


    { 
     System.out.printf("number of players(2 -4)? "); 

    int p = scanner.nextInt(); 
    scanner.nextLine(); 
    for(int i=0;p>4 || p<2;i++) 
    { 

     System.out.printf("only 2-4 players.\n"); 
     System.out.printf("number of players(2 -4)?"); 
     p = scanner.nextInt(); 
     scanner.nextLine(); 

    } 
    Player pl=new Player(); 
    int m=1; 
    for(int k=1;k<=p;k++) 
    { 


     System.out.printf("give the name of the player %d: ",k); 
     s= scanner.nextLine(); 
     pl.setName(s,m); 
     System.out.printf(pl.getName()); 
     Playerlist.add(pl); 
     m++; 
     } 
    public class Player { 

    private String name; 
    private int id; 

    public Player() { 
    } 

    Player(String val,int k) { 
    this.name = val; 
    this.id=k;} 
    /** 
    * getName 
    * 
    */ 
public String getName() { 
    return name; 
} 

/** 
* setName 

*/ 
public void setName (String val,int k) { 
    this.name = val; 
    this.id=k; 
} 
public void displayStudentDetails(){ 
    System.out.println("ID is "+id); 
    System.out.println("Name is "+name)}; 

...私は多くのことを試してみましたが、彼らは仕事をdidntの....

+0

私は "idで検索する"を理解していません。 PlayerのオブジェクトをArrayListに追加すると、配列リストを調べるだけで、各プレーヤーのIDと名前を取得できます。 あなたは何を望んでいるかの例を挙げることができますか? –

+0

idsをどのように割り当てているかに基づいて、最初のプレイヤーは1から始まり、1だけ増加するように見えます(プレイヤー2はid 2を持つため)。これが常にそうである場合、 "id"のためにプレーヤーを得るためにはPlayerlist.get(id - 1);を実行します。 –

答えて

2

より良い解決策は、IDと、HashMap<Integer, String>を使用することですキーであり、名前は値である。次に、あなたが簡単に検索できます。

HashMap<Integer, String> map = new HashMap<Integer, String>(); 
map.put(1, "Robert"); 
map.put(2, "Jeff"); 

を次に検索する:

String name = map.get(1); // will return "Robert" 

編集:[OK]を、あなただけの名前よりも多くのデータが必要な場合は、スコアのように、あなたは、データ型を作成する必要があります。 。同様に:

public class Player { 
    private String name; 
    private int score; 
    // etc. 

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

そして、あなたは次のようにマップにこのタイプのオブジェクトを追加することができます。

この時点でグローバル変数を使用せずに別のファイル内のクラスを持つべきであるという事実を無視
map.put(1, new Player("Robert", 10)); 
+0

それはうまく動作します! – nick

+0

@des:あなたの問題を解決した場合は、了解を選択することを忘れないでください。 :) – Tudor

+0

私のHashMapにもっと多くのものを加えることができるかどうか知っていますか?たとえば、私はeschプレーヤーにスコアを追加したいと思います。> 1、Robert、300または2、Jeff、 450私はidによってそれを検索すればwiiは名前とスコアを返します... – nick

0

...

/** 
* Searches the PlayerList Arraylist for a Player having the ID of the parameter passed 
*/ 
public Player searchByID(int id) { 
    //Do some sort of check on id to ensure its valid? 
    for (int i = 0; i < PlayerList.size(); i++) { 
    if (PlayerList.get(i).getID() == id) { 
     return PlayerList.get(i); 
    } 
    } 

    return null; 
} 
0

おそらくArrayListが間違ったデータ構造です。 idの順番で要素を取得したい場合は、 "idsは1から10までで、未使用のidsはありません"などのことを確認できるという意味で、idがすべて標準である場合はHashMapが必要です。 idセットが疎である場合は、他のユースケースに応じてTreeMapまたはTreeSetを使用する必要があります。

0

あなたはIDによってプレーヤーを取得する必要がある状況は、あなたのコードが選手を追加する方法に厳密に基づいている場合、その後、あなただけ行うことができます。

public Player getPlayerById(int id) 
{ 
    return PlayerList.get(id - 1); 
} 

あなたが直線的に1から始まるプレイヤーIDを割り当てているので、最初のプレーヤーのために。プレーヤーやIDの順序を変更したり、変更したりする場合は、他の提案の1つを使用する必要があります(ただし、それをやっていない場合は、これが最も最適化された解決策です)。

注:上記のコードでは、idがプレーヤーリストに存在しない場合は、ArrayIndexOutOfBoundsExceptionがスローされます。どのように処理するかによって、コードを変更することができますか?

関連する問題