QA@IT

別クラスを通して変数の扱うためにHashMap、Iteratorを利用したいのですが上手くいかず困っています

3977 PV

ある競技Firstステージ、Secondステージでのポイントを以下のようにユーザ毎に管理させる
更にいうとユーザ毎にそれぞれのフィールドの変数を管理したいのですが上手くいかないです。

name  first_point  second_point
"太郎"     3             2
"五郎"     5             1
"次郎"     2             5

ユーザのステージポイントなどのフィールドを記したUserクラスと
HashMapとIteratorでユーザ情報の登録を行うPlayerクラスを作っています。

すでに登録済みのユーザを新規登録のelse文の判定になってしまってしまいます。
そしてそのHashMapの確認にIteratorを利用して中身を確認しようとしたのですが
get(key)メソッドでただの変数でなくUserクラスのインスタンス変数への代入となった場合の
記し方がわからず困っています。

簡潔にしますと

  • HashMapですでに登録済みのユーザを新規登録のelse文の判定になってしまってしまいます。
  • IteratorでUserクラスのフィールドに対するget(key)メソッドの使い方がわかりません。

よろしければご教授お願いします。

Iteratorについては以下のページを参考にさせていただきました。
http://www.mlab.im.dendai.ac.jp/~yamada/ir/Map/

public class User(name)
{

    private String name_ = name;

    public static int first_point = 0;
    public static int second_point = 0;
}


public class Player
{
String name = "";
User user = new User(name);
HashMap<String,User> userdata = new HashMap<String,User>();

//同じ名前だったら登録済みのフィールド変数を更に加算
if(userdata.containsKey(name)//同じ名前だったら
          {
          System.out.println("hashmapTesTest_if_すでに登録済み" + userdata.get(name).first_point);
          userdata.get(name).first_point++;
          }

//違う名前だったら新規登録
          else{
//ユーザID(String),Userクラス(User)のハッシュマップペアを作成する
          userdata.put(name,user);
 System.out.println("hashmapTesTest_else_新規登録" + userdata.get(name).first_point);
          userdata.get(name).first_point++;
          }

////////////////以下Iterator///////////////////////

      Iterator<String> iterator = userdata.keySet().iterator();
while(iterator.hasNext()) {
      String key = iterator.next();

//////////////////////////////////////////////////////
      ??? = userdata.get(key);
      int value = userdata.get(key);では型違いエラー
//////////////////////////////////////////////////////

      System.out.println("Iterator:" + key + ": " + value);


      }

}
  • 何を目的としたコードなのかがわかりにくいです。

    ●Userクラスのfirst_pointとsecond_pointはstaticではダメだと予想します。
    ●Playerクラス内のコードはaddFirstPointForUser(String userName)のようなメソッドになるべきなのでは?
    ●Iteratorの処理の最終目的はなんですか?
    -
  • 回答ありがとうございます。
    ここでのIteratorの目的は単に今までputで登録したユーザ、そのポイントがユーザの重複による条件を考慮して登録されているか確認することのみ行いたいです。
    あとint value = userdata.get(key);
    の右辺をfirst_pointの値を得るにはどのように書きなおすとよろしいのでしょうか

    -
  • int32_tさんが仰るように、staticはクラスに所属します。クラスに所属すると生成したインスタンス間で変数は共有されてしまい、このコードではUserが同じポイントになってしまいます。 -
  • 回答ありがとうございます。
    staticは付けずにクラスに対してでなくオブジェクトのインスタンスに対して変数を割り当てる必要があるのですね。ありがとうございます。
    -

回答

userdataは逆にstaticでないと、インスタンスごとのMapになってcontainsKey()で判断できない。
User内のstaticフィールドの件もそうですが、staticの意味をきちんと理解していないということでしょうね。

「???」は、「User user」となりますが、どちらかというと
for (Map.Entry<String, User> entry : userdata) {
String name = entry.getKey();
User user = entry.getValue();

}
の方が良いですね。

編集 履歴 (1)
  • 回答ありがとうございます。
    staticの件修正しました。
    今後気をつけようと思います。
    重ねて申し訳ないですがuserdataをstaticにするにはどのように記述すると良いのでしょうか。
    あとUser user = entry.getValue();の後に
    user.first_point;とすると間接参照できないと帰ってくるのですがどのようにするとよいのでしょうか。
    -
  • 返事がつかないようなので、こちらに。質問しているコードとSaiRyoさんの修正したコードがかなり乖離していると思います(間接参照できない等発生する理由がわかりません)。一旦ご提示のコードを修正するなり、現在のコードを見せてください。 -
  • 回答ありがとうございます。
    遅くなってすいません。
    なんとかこちらで解決できました。
    少しプログラムを追加したためエラーが返ってきたのですので最初の問題の件は理解しました。
    お手数おかけしました。
    ありがとうございました。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。