をどのように並べ替えることができHashMap<key, ArrayList>
ますか?
の値に基づいてソートしたいArrayList
。
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>>
が、セットとリストのセマンティクスは少し異なります。
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
、後で使用することもできます。
ツリーマップが必要なようです。
http://docs.oracle.com/javase/7/docs/api/java/util/TreeMap.html
該当する場合は、カスタム コンパレータを渡すことができます。
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);
それ以上の情報がなければ、あなたが何を望んでいるのかを正確に知ることは困難です. ただし、使用するデータ構造を選択するときは、それが何のために必要かを考慮する必要があります。ハッシュマップはソート用に設計されていません。簡単に検索できるように設計されています。したがって、あなたの場合、おそらくハッシュマップから各要素を抽出し、それらをヒープやセットなどの並べ替えに適したデータ構造に入れ、そこで並べ替える必要があります。
効率的な検索のためにMapをSortedMapと組み合わせたい場合は、ConcurrentSkipListMapを使用できます。
もちろん、キーはソートに使用される値である必要があります。
値による 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
}
キーによる並べ替え:
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));
}
}