2015-04-28 28 views
6

Ben kelimeleri ve ben üzerinden yineleme kelimeleri yazdırmak için böylece onu sıralamak için çalışıyorum aşağıdakiEşit Listesi <String, Tamsayı> nasıl sıralayabilirim?

private List<Pair<String, Integer>> words = new ArrayList<Pair<String, Integer>(); 

gibi onların frekansını depolayan commmons Pair bir listesi var, ben en yüksek olan sözcükler istiyorum ilk önce görünme sıklığı.

Ben Comparable uygulamakla etrafında oynamaya çalıştı ama çoğu örnekler Bir özel Comparator kullanabilirsiniz

+1

bunu kullanmayı mümkün olmalıdır: http://stackoverflow.com/questions/16252269/how-to-sort-a-list-arraylist-in-java –

+0

bunu tanımlamak daha iyi olduğunu düşünmüyor musunuz a 'Pair' kelime ve onun frekansı, "Pair" yapısını, commons'tan kullanmak yerine. Bu şekilde, kelime (veya) frekansına göre sıralama ölçütlerini tanımlamak için özel bir "Karşılaştırıcı" oluşturabilirsiniz. – Arkantos

+1

Neden bir Harita kullanmıyorsunuz? Harita wordsFrequencyMap; – ACV

cevap

14

Çiftler listesini kullanmaya benzer değildir: numarası sırasını azaltarak elemanlarını sıralamak için

Collections.sort(words, new Comparator<Pair<String, Integer>>() { 
    @Override 
    public int compare(final Pair<String, Integer> o1, final Pair<String, Integer> o2) { 
     // TODO: implement your logic here 
    } 
}); 
11

Collections.sort(words, Comparator.comparing(p -> -p.getRight())); 

Bu, çiftin "doğru" sırasını azalan sırada kullanacaktır.

Bu, Java 8 kullanır. Not olarak, değeri kutucuyorsunuz ve Integer.compareTo kullanıyorsunuz. Bununla birlikte, kaçış analizi ile, boks elimine edilebilir ve herhangi bir nesne yaratmıyor olabilirsiniz.

+0

bu kutucuğu mu yoksa Integer compareTo? –

+0

@BoristheSpider iyi bir nokta. –

2

Merhaba, bunun sizin için çalışması gerektiğini düşünüyorum.

List<Pair<String, Integer>> words = new ArrayList<Pair<String, Integer>>(); 
    words.add(new Pair<String, Integer>("hello",2)); 
    words.add(new Pair<String, Integer>("hello",1)); 
    words.add(new Pair<String, Integer>("aello",3)); 

    words.sort(new Comparator<Pair<String, Integer>>() { 
     @Override 
     public int compare(Pair<String, Integer> o1, Pair<String, Integer> o2) { 
      if (o1.getValue() > o2.getValue()) { 
       return -1; 
      } else if (o1.getValue().equals(o2.getValue())) { 
       return 0; // You can change this to make it then look at the 
          //words alphabetical order 
      } else { 
       return 1; 
      } 
     } 
    }); 

    System.out.println(words); 
+2

Integer tarafından sağlanan compareTo() 'ye güvenmenin kendiniz için yeniden yazmak yerine daha iyi olacağını düşünmüyor musunuz? –

+0

Elbette ama eğer frekans aynı ise alfabetik olarak değerleri daha fazla sıralamak istiyorsanız, o zaman çok fazla bir fark yaratmaz. Ama eğer değilseniz, Integer.compare (o1.getValue(), o2.getValue()) döndürme; daha kolay evet. –

+2

@GregKing Veya siz _could_'u kullanın ['Comparator.thenComparing'] (https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#thenComparing-java.util.function.Function -java.util.Comparator-). Ne kadar gereksiz kod yazmak istediğinizi bağlıyım. –

2

(ayrıca sırasını tersine çevirmek gerekir) Comparator.comparing ile birlikte bir Java 8 lambda kullanın:

sadece azalan sıklık sırasına göre değerleri yazdırmak istediğiniz

kolay yolu ise

import static java.util.Collections.reverseOrder; 
import static java.util.Comparator.comparing; 

final List<Pair<String, Integer>> words = new ArrayList<>(); 
final Comparator<Pair<String, Integer>> c = reverseOrder(comparing(Pair::getValue)); 
Collections.sort(words, c); 
:

words.stream() 
     .sorted(c) 
     .map(Pair::getKey) 
     .forEach(System.out::println); 
İlgili konular