123

をどのように並べ替えることができHashMap<key, ArrayList>ますか?

の値に基づいてソートしたいArrayList

4

17 に答える 17

146

HashMap を使用する必要がありますか? Map インターフェイスのみが必要な場合は、TreeMapを使用します


HashMap の値を比較して並べ替えたい場合。HashMap の値を並べ替えることができたら、これを行うにはコードを記述する必要があります。

Map<String, Person> people = new HashMap<>();
Person jim = new Person("Jim", 25);
Person scott = new Person("Scott", 28);
Person anna = new Person("Anna", 23);

people.put(jim.getName(), jim);
people.put(scott.getName(), scott);
people.put(anna.getName(), anna);

// not yet sorted
List<Person> peopleByAge = new ArrayList<>(people.values());

Collections.sort(peopleByAge, Comparator.comparing(Person::getAge));

for (Person p : peopleByAge) {
    System.out.println(p.getName() + "\t" + p.getAge());
}

このソートされたリストに頻繁にアクセスしたい場合は、要素を に挿入できますHashMap<TreeSet<Person>>が、セットとリストのセマンティクスは少し異なります。

于 2009-04-23T06:57:35.197 に答える
23

http://snipplr.com/view/2789/sorting-map-keys-by-comparing-its-values/

鍵を入手する

List keys = new ArrayList(yourMap.keySet());

それらを並べ替える

 Collections.sort(keys)

それらを印刷します。

いずれにせよ、HashMap でソートされた値を持つことはできません (API によるとThis class makes no guarantees as to the order of the map; in particular, it does not guarantee that the order will remain constant over time)。

これらすべての値を にプッシュすることもできますがLinkedHashMap、後で使用することもできます。

于 2009-04-23T09:23:52.333 に答える
13

ツリーマップが必要なようです。

http://docs.oracle.com/javase/7/docs/api/java/util/TreeMap.html

該当する場合は、カスタム コンパレータを渡すことができます。

于 2009-04-23T06:58:25.723 に答える
11

Java 8 では:

Comparator<Entry<String, Item>> valueComparator = 
    (e1, e2) -> e1.getValue().getField().compareTo(e2.getValue().getField());

Map<String, Item> sortedMap = 
    unsortedMap.entrySet().stream().
    sorted(valueComparator).
    collect(Collectors.toMap(Entry::getKey, Entry::getValue,
                             (e1, e2) -> e1, LinkedHashMap::new));

グアバの使用:

Map<String, Item> map = ...;
Function<Item, Integer> getField = new Function<Item, Integer>() {
    public Integer apply(Item item) {
        return item.getField(); // the field to sort on
    }
};
comparatorFunction = Functions.compose(getField, Functions.forMap(map));
comparator = Ordering.natural().onResultOf(comparatorFunction);
Map<String, Item> sortedMap = ImmutableSortedMap.copyOf(map, comparator);
于 2013-03-16T23:10:48.667 に答える
4

それ以上の情報がなければ、あなたが何を望んでいるのかを正確に知ることは困難です. ただし、使用するデータ構造を選択するときは、それが何のために必要かを考慮する必要があります。ハッシュマップはソート用に設計されていません。簡単に検索できるように設計されています。したがって、あなたの場合、おそらくハッシュマップから各要素を抽出し、それらをヒープやセットなどの並べ替えに適したデータ構造に入れ、そこで並べ替える必要があります。

于 2009-04-23T06:53:05.283 に答える
3

効率的な検索のためにMapをSortedMapと組み合わせたい場合は、ConcurrentSkipListMapを使用できます。

もちろん、キーはソートに使用される値である必要があります。

于 2009-04-23T07:19:09.153 に答える
2

値による HashMap の並べ替え:

他の人が指摘したように。HashMaps は、簡単に検索できるようにするためのものです。これを変更するか、マップ自体の中で並べ替えようとすると、O(1) 検索がなくなります。

並べ替えのコードは次のとおりです。

class Obj implements Comparable<Obj>{
    String key;
    ArrayList<Integer> val;
    Obj(String key, ArrayList<Integer> val)
    {
    this.key=key;
    this.val=val;
    }
    public int compareTo(Obj o)
    {
     /* Write your sorting logic here. 
     this.val compared to o.val*/
     return 0;
    }
}

public void sortByValue(Map<String, ArrayList<>> mp){

    ArrayList<Obj> arr=new ArrayList<Obj>();
    for(String z:mp.keySet())//Make an object and store your map into the arrayList
    {

        Obj o=new Obj(z,mp.get(z));
        arr.add(o);
    }
    System.out.println(arr);//Unsorted
    Collections.sort(arr);// This sorts based on the conditions you coded in the compareTo function.
    System.out.println(arr);//Sorted
}
于 2015-07-21T17:52:34.330 に答える
2

キーによる並べ替え:

public static void main(String[] args) {
    Map<String,String> map = new HashMap<>();

    map.put("b", "dd");
    map.put("c", "cc");
    map.put("a", "aa");

    map = new TreeMap<>(map);

    for (String key : map.keySet()) {
        System.out.println(key+"="+map.get(key));
    }
}
于 2018-08-29T11:11:10.367 に答える