2013-03-15 20 views
6

HashMap adresinden ilk 10 değeri nasıl alabilirim anlamaya çalışıyorum. Başlangıçta TreeMap kullanmayı denedim ve buna göre sıraladım ve ilk 10 değerini aldım, ancak seçenek bu değil gibi görünüyor, TreeMap anahtar tarafından sıralar. Karma harita içinde ilk 10 değeri elde edin

Hala tuşları yüksek değerlere sahip olduğunu öğrenmek isterler, haritanın K, V String, Integer bulunmaktadır.

+4

üst 10 ne demek? neye bağlı olarak? – jsedano

+0

Karşılaştırmakta olduğunuz elemanların türünü göstermek için lütfen bir kod yazabilir misiniz? –

+0

TreeMap sizin için sıralama yapabilir. Ama bize neyi anlamaya çalıştığınızı bilmemiz için bize söylemek zorundasınız! – Kevin

cevap

0

Korkarım tüm harita üzerinde yinelemek zorundasınız. Heap, this book'da açıklandığı gibi en üst K öğelerini bulmak için yaygın olarak kullanılan bir veri yapısıdır.

Belki
List list = new ArrayList(hashMap.values()); 
Collections.sort(list); 
for(int i=0; i<10; i++) { 
    // Deal with your value 
} 
0

o zaman bu deneyin (değerler en az Karşılaştırılabilir uygulayan sayısal veya varsayılarak) hashmap içinde saklanan nesneler. Sonra bütün değerlerin bir dizi listesi oluşturabilirsiniz:

List<YourValueType> l = new ArrayList<YourValueType>(hashmap.values()); 
Collection.sort(l); 
l = l.subList(0,10); 

Selamlar

+0

Bu yalnızca "Foo" değeri "Karşılaştırılabilir" değerini uygularsa çalışacaktır " 've ham liste türünü kullanmıyorsunuz. – jlordo

+0

Eğer OP kendi sorusunda belirttiyse ham tipi koyardım :) – aymeric

2

Eğer değere Comparable Arayüz uygulamalıdır: Haritanın 10 en yüksek değerlere almaya çalışıyorsanız

+0

Oldukça iyi bir çözüm. Sadece benzer bir şeye ihtiyacım vardı. Sadece değerleri sağladığından, aynı zamanda tuşlara da ihtiyacım vardı. Giriş setini kullanabilmek için hafif bir değişiklik yaptım ve bir Karşılaştırıcı ekledim. Karşılaştırıcı, giriş değerlerini azalan sırada karşılaştırmalıdır. Liste > results = new ArrayList <> (hashmap.entrySet()); Collections.sort (sonuç, yeni EntryComparator()); results = results.subList (0, 10); – sebadagostino

+1

Başka bir yanıt olarak ekliyorum çünkü bir yorum olarak kötü görünüyor – sebadagostino

0

Diyelim ki bir harita olduğunu varsayalım, ancak bu örnek

Map<String, String> m = yourMethodToGetYourMap(); 
List<String> c = new ArrayList<String>(m.values()); 
Collections.sort(c); 
for(int i=0 ; i< 10; ++i) { 
    System.out.println(i + " rank is " + c.get(i)); 
} 
2
import java.util.Comparator; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.TreeMap; 

public class Testing { 

    public static void main(String[] args) { 

     HashMap<String,Double> map = new HashMap<String,Double>(); 
     ValueComparator bvc = new ValueComparator(map); 
     TreeMap<String,Double> sorted_map = new TreeMap<String,Double>(bvc); 

     map.put("A",99.5); 
     map.put("B",67.4); 
     map.put("C",67.4); 
     map.put("D",67.3); 

     System.out.println("unsorted map: "+map); 

     sorted_map.putAll(map); 

     System.out.println("results: "+sorted_map); 
    } 
} 

class ValueComparator implements Comparator<String> { 

    Map<String, Double> base; 
    public ValueComparator(Map<String, Double> base) { 
     this.base = base; 
    } 

    // Note: this comparator imposes orderings that are inconsistent with equals.  
    public int compare(String a, String b) { 
     if (base.get(a) >= base.get(b)) { 
      return -1; 
     } else { 
      return 1; 
     } // returning 0 would merge keys 
    } 
} 
+0

Oh vay, sadece bunu yapabilirim, şimdi bir atış vereceğim, TEŞEKKÜRLER! – Tohmas

+0

@Biswajit, bana bu kodun karmaşıklığını açıklayabilir misiniz?Kodunuz mükemmel çalışıyor ve çok kolay yaklaşımı, sadece bu kodun karmaşıklığını hesaplamak istedim .... – Rushi

+0

@Biswajit, kod harika, ama TreeMap'in boyutunun her zaman 10 olmasını nasıl sağlıyorsunuz? Çünkü sadece TOP TEN'e sahip olmak istiyorsun? Ağaç Haritası'na anahtar/değer çiftini her eklediğinizde, geçerli boyutun on'dan büyük olup olmadığını kontrol etmeniz gerekir, eğer varsa, TreeMap'teki en küçük anahtar/değer çiftini silmeniz gerekir. Bu son bölümü kodda nasıl yapıyorsunuz? İnsanların benim soruma burada cevap vereceğini düşünmedim, bu yüzden bu gönderiye yeni bir soru sordum [Here] (http://stackoverflow.com/questions/37244198/how-to-maintain-a-java-treemap-size to-be-a ilave sabit-süre-anahtarlı değer çifti) –

0

her tür için çalışabilir Cevabımı bu konuya göre sk2212

İlk olarak Böyle nitelik "HashMap" için bunun gibi

class EntryComparator implements Comparator<Entry<String,Integer>> { 

    /** 
    * Implements descending order. 
    */ 
    @Override 
    public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) { 
     if (o1.getValue() < o2.getValue()) { 
      return 1; 
     } else if (o1.getValue() > o2.getValue()) { 
      return -1; 
     } 
     return 0; 
    } 

} 

Sonra bir yöntemde kullanabilirsiniz: azalan bir karşılaştırıcı uygulamak gerekir

public List<Entry<String,Integer>> getTopKeysWithOccurences(int top) { 
    List<Entry<String,Integer>> results = new ArrayList<>(hashmap.entrySet()); 
    Collections.sort(results, new EntryComparator()); 
    return results.subList(0, top); 
} 
İlgili konular