SORU
19 Mayıs 2010, ÇARŞAMBA


Değer TreeMap sıralama

Bana varsayılan doğal sıralama yerine değer TreeMap tür sağlayacak bir karşılaştırma yazmak istiyorum. böyle bir şey denedim, ama neyin yanlış gittiğini öğrenmek değil

import java.util.*;

class treeMap {
    public static void main(String[] args) {
        System.out.println("the main");
        byValue cmp = new byValue();
        Map<String, Integer> map = new TreeMap<String, Integer>(cmp);
        map.put("de",10);
        map.put("ab", 20);
        map.put("a",5);

        for (Map.Entry<String,Integer> pair: map.entrySet()) {
            System.out.println(pair.getKey() ":" pair.getValue());
        }
    }
}

class byValue implements Comparator<Map.Entry<String,Integer>> {
    public int compare(Map.Entry<String,Integer> e1, Map.Entry<String,Integer> e2) {
        if (e1.getValue() < e2.getValue()){
            return 1;
        } else if (e1.getValue() == e2.getValue()) {
            return 0;
        } else {
            return -1;
        }
    }
}

Sanırım benzer işleve alır.ne olduğunu soruyorum, ben bir Harita alın.Giriş karşılaştırıcı geçti?

CEVAP
19 Mayıs 2010, ÇARŞAMBA


SortedMap belirtimi karşı beri değerleri üzerinde TreeMap kendisi öyle, sen değil

Bir daha sağlayan 7**sipariş toplamonun üzerindeanahtarları.

Ancak, harici bir koleksiyon kullanarak, her zaman Map.entrySet() ancak sıralayabilirsiniz istediğiniz, ya da anahtarlarını, değerler, ya da bir kombinasyon bile(!!) iki.

İşte Map.Entry, Comparable olan Map verilen SortedSet bir döndüren genel bir yöntem:

static <K,V extends Comparable<? super V>>
SortedSet<Map.Entry<K,V>> entriesSortedByValues(Map<K,V> map) {
    SortedSet<Map.Entry<K,V>> sortedEntries = new TreeSet<Map.Entry<K,V>>(
        new Comparator<Map.Entry<K,V>>() {
            @Override public int compare(Map.Entry<K,V> e1, Map.Entry<K,V> e2) {
                int res = e1.getValue().compareTo(e2.getValue());
                return res != 0 ? res : 1;
            }
        }
    );
    sortedEntries.addAll(map.entrySet());
    return sortedEntries;
}

Şimdi aşağıdakileri yapabilirsiniz:

    Map<String,Integer> map = new TreeMap<String,Integer>();
    map.put("A", 3);
    map.put("B", 2);
    map.put("C", 1);   

    System.out.println(map);
    // prints "{A=3, B=2, C=1}"
    System.out.println(entriesSortedByValues(map));
    // prints "[C=1, B=2, A=3]"

Not şu acayip şeyi olacak Eğer seni denemek için Değiştir ya SortedSet kendisi veya Map.Entry içinde, çünkü o artık bir "görünüm" orijinal harita gibi entrySet().

Genel olarak konuşursak, kendi değerlerine göre bir harita girişleri sıralamak gereken bir ilaçtır.


Integer == not

Orijinal karşılaştırıcı Integer == kullanarak karşılaştırır. Bu Integer işlenen == referans eşitlik, değer olduğundan neredeyse her zaman yanlış.

    System.out.println(new Integer(0) == new Integer(0)); // prints "false"!!!

İlgili sorular

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • cyriak

    cyriak

    29 Mart 2006
  • MADFINGER Games a.s.

    MADFINGER Ga

    21 NİSAN 2009
  • Trevor Eckhart

    Trevor Eckha

    19 Aralık 2009