web-dev-qa-db-ja.com

Java-HashMapでキーのインデックスを取得しますか?

Java HashMapkeySet()をループしている場合、(ループ内で)どうすればそのキーの数値インデックスを取得できますか?

基本的に、マップをループするとき、0,1,2 ...を取得できるようにしたいのですが、これはintを宣言して各反復で増分するよりもクリーンになると思います。

ありがとう。

42
llm

HashMapの代わりにLinkedHashMapを使用します。keySet()を呼び出すときは、常に同じ順序で(挿入として)キーを返します。

詳細については、 Class LinkedHashMap を参照してください

50
trayzey

これが「クリーナー」かどうかはわかりませんが、次のとおりです。

List keys = new ArrayList(map.keySet());
for (int i = 0; i < keys.size(); i++) {
    Object obj = keys.get(i);
    // do stuff here
}
43
Binil Thomas

HashMapには、キーの順序が定義されていません。

21

ハッシュマップ自体から値を取得するだけであれば、次のようなことができます。

for (Object key : map.keySet()) {
    Object value = map.get(key);
    //TODO: this
}

または、関心がある場合は、マップのエントリを反復処理できます。

for (Map.Entry<Object, Object> entry : map.entrySet()) {
    Object key = entry.getKey();
    Object value = entry.getValue();
    //TODO: other cool stuff
}

コミュニティとして、なぜインデックスが必要なのか、またはインデックスがあなたに何ができると考えているのかがわかれば、より良い/より適切な答えを提供できるかもしれません。

12
aperkins

できません-セットは順序付けられていないため、インデックスは提供されません。あなたが言うように、intを宣言する必要があります。次回keySet()を呼び出すときに、必ずしも同じ順序で結果が得られるとは限らないことを覚えておいてください。

9
Kris Jenkins

簡単に言えば、ハッシュベースのコレクションはインデックス化されないため、手動で行う必要があります。

5
Esko

私は最近、ハッシュマップの背後にある概念を学習していましたが、キーの明確な順序付けがないことは明らかでした。反復するには、次を使用できます。

Hashmap<String,Integer> hs=new Hashmap();
for(Map.Entry<String, Integer> entry : hs.entrySet()){
      String key=entry.getKey();
      int val=entry.getValue();
      //your code block  
  }
4
Neelesh Salian

これを@Binil Thomasの答えに対する同等に実行可能な代替手段として投稿しました-コメントとして追加しようとしましたが、すべての読みやすさを確信していませんでした。

int index = 0;

for (Object key : map.keySet()) {
   Object value = map.get(key);
   ++index;
}

これは回避しようとしていた文字通りの状況であるため、おそらく元の質問ポスターには役立たないでしょうが、簡単な答えを探している他の人を助けるかもしれません。

3
Benjineer