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

  • infodirt

    infodirt

    11 Mart 2009
  • UberFacts

    UberFacts

    26 EKİM 2013
  • Video-Tutorials.Net

    Video-Tutori

    15 Mart 2011