web-dev-qa-db-ja.com

Java順序マップ

Javaでは、キーと値のペアを格納およびアクセスするためのMapのように動作しますが、キーと値のリストが同じ順序になるようにキーの順序付きリストと値の順序付きリストを返すことができます。

コードによる説明として、架空のOrderedMapのように動作するものを探しています。

OrderedMap<Integer, String> om = new OrderedMap<>();
om.put(0, "Zero");
om.put(7, "Seven");

String o = om.get(7); // o is "Seven"
List<Integer> keys = om.getKeys();
List<String> values = om.getValues();

for(int i = 0; i < keys.size(); i++)
{
    Integer key = keys.get(i);
    String value = values.get(i);
    Assert(om.get(key) == value);
}
285
Whatsit

SortedMap インターフェース(実装は TreeMap )があなたの友達になるはずです。

インターフェースには以下のメソッドがあります。

  • keySet() キーの集合を昇順で返します
  • values() すべての値のコレクションを対応するキーの昇順で返します。

だから、このインターフェースはあなたの要求にぴったり合っています。ただし、鍵は意味のある順序でなければなりません。それ以外の場合は、挿入順序によって順序が決定される LinkedHashMap を使用できます。

353
dmeister

キーと値のペアを格納およびアクセスするためのMapのように動作するが、キーと値のリストが同じ順序になるようにキーの順序付きリストと値の順序付きリストを返すことができるオブジェクトはありますか。

探しているのは Java.util.LinkedHashMap です。 Map.Entry <K、V> のペアのリストが表示されます。これらは常に同じ順序で繰り返されます。 。その順番は、項目を入れる順番と同じです。または、 Java.util.SortedMap を使用します。ここで、キーは自然順序付けを持つか、Comparatorで指定される必要があります。

193
John Feminella

LinkedHashMapはキーの順序を維持します。

それ以外は、Java.util.LinkedHashMapは通常のHashMapとまったく同じように機能します。

17
VoNWooDSoN

フレームワークから得られる最も近いコレクションは SortedMap だと思います

6
bruno conde

昇順または降順のキー順でアクセスして移動できる NavigableMap インタフェースを利用できます。このインタフェースは、 優先 SortedMapインタフェースです。ナビゲート可能なマップは通常、そのキーの自然な順序に従って、またはマップ作成時に提供されるコンパレータによってソートされます。

それには3つの最も有用な実装があります: TreeMapImmutableSortedMap 、および ConcurrentSkipListMap

TreeMapの例:

TreeMap<String, Integer> users = new TreeMap<String, Integer>();
users.put("Bob", 1);
users.put("Alice", 2);
users.put("John", 3);

for (String key: users.keySet()) {
  System.out.println(key + " (ID = "+ users.get(key) + ")");
}

出力:

Alice (ID = 2)
Bob (ID = 1)
John (ID = 3)
4

SortedMapインターフェースはあなたが望むものを強制し、TreeMapはそれを実装していると思います。

http://Java.Sun.com/j2se/1.5.0/docs/api/Java/util/SortedMap.htmlhttp://Java.Sun.com/j2se/ 1.5.0/docs/api/Java/util/TreeMap.html

3
CJ F

Java 6以降、 TreeMap の代わりにノンブロッキングのスレッドセーフな代替手段もあります。 ConcurrentSkipListMap を参照してください。

3
Vadzim

値でマップをソートするために単純なハッシュマップ、リンクリスト、コレクションを使っています。

import Java.util.*;
import Java.util.Map.*;
public class Solution {

    public static void main(String[] args) {
        // create a simple hash map and insert some key-value pairs into it
        Map<String, Integer> map = new HashMap<String, Integer>();
        map.put("Python", 3);
        map.put("C", 0);
        map.put("JavaScript", 4);
        map.put("C++", 1);
        map.put("Golang", 5);
        map.put("Java", 2);
        // Create a linked list from the above map entries
        List<Entry<String, Integer>> list = new LinkedList<Entry<String, Integer>>(map.entrySet());
        // sort the linked list using Collections.sort()
        Collections.sort(list, new Comparator<Entry<String, Integer>>(){
        @Override
         public int compare(Entry<String, Integer> m1, Entry<String, Integer> m2) {
        return m1.getValue().compareTo(m2.getValue());
        }
      });
      for(Entry<String, Integer> value: list) {
         System.out.println(value);
     }
   }
}

出力は以下のとおりです。

C=0
C++=1
Java=2
Python=3
JavaScript=4
Golang=5
0