2015-08-31 2 views
-1

Я закончил свой код, чтобы найти по 20 слов после поиска много раз, но это не в нисходящем слове. мне нужно добавить код для сортировки списка по частоте в порядке убывания, если два слова имеют один и тот же номер счета:Как сортировать список по частоте в порядке убывания

{ «кошка» => 43, «C» => 43}

выход должен быть

с

кошка

Мой код:

public static void main(String[] args) throws IOException{ 

      String delimiters = ".;_?>*/"; 

      String[] result = new String[20]; 
      List<String> listArray = new ArrayList<String>(); 
      Map<String, Integer> map = new HashMap<String, Integer>(); 
      FileReader fileR = new FileReader("D:/test.txt"); 
      BufferedReader bufferedR = new BufferedReader(in); 
      String line; 

      while ((line = bufferedR.readLine()) != null) { 
        StringTokenizer sToken = new StringTokenizer(line, delimiters); 
        while (sToken.hasMoreTokens()) { 
         String token = sToken.nextToken().trim().toLowerCase(); 
            if (map.containsKey(token)) { 
             int val = map.get(token); 
             val++; 
             map.put(token, val); 



            } else{ 
             map.put(token, 1); 

            }      
       } 
      } 
      bufferedR.close(); 
      for(int i=0;i<result.length;i++){ 
       int mValu=0; 
       String wKey=""; 
       for(Map.Entry<String,Integer> entry:map.entrySet()){ 
        if(entry.getValue()>mValu){ 
         mValue=entry.getValue(); 
         wKey=entry.getKey(); 
        } 
       } 
       map.remove(wKey); 
       result[i]=wKey; 

      } 
      for (int i = 0 ; i<result.length;i++){ 
       System.out.println(result[i]); 

     } 
     } 
    } 

Когда я исследование по этой теме я нашел этот код, но не знаю, как вписать его в мой код:

List<Map.Entry<String, Integer>> entries = new `ArrayList`<Map.Entry<String, Integer>>(map.entrySet()); 
    Collections.sort(entries, new Comparator<Map.Entry<String, Integer>>() { 
     public int compare(Map.Entry<String, Integer> a, Map.Entry<String, Integer> b) { 
      return Integer.compare(b.getValue(), a.getValue()); 
     } 
    }); 

Или есть лучшая идея, как получить частоты в порядке убывания ?!

Спасибо за помощь.

ответ

1

Вы можете сделать:

import java.util.Comparator.*; 
import java.util.stream.Collectors.*; 

Map<String, Integer> map = // ... 
List<String> ss = map.entrySet().stream() 
        .sorted(comparing(e -> e.getValue()) 
           .reversed() 
           .thenComparing(e -> e.getKey())) 
        .map(e -> e.getKey()) 
        .collect(toList()); 
+0

Я получил сообщение об ошибке после добавления кода и вам нужно создать метод toList(). Не могли бы вы показать, какая часть должна быть добавлена ​​в мой код. Я не знаю, как это работает. – ghco

+0

Я добавил необходимый импорт –

+0

Кроме того, можете ли вы уточнить заказ, который вы ожидаете в качестве выхода? –

0

Что вам нужно сделать, это своего рода ваша карта. Насколько я понимаю, вы хотите получить 20 верхних значений, и если два значения имеют одинаковый токен, то он должен быть в лексикографическом порядке.

Моим решением будет сортировать вашу карту сначала с помощью ключа (токена в вашем случае) и , затем сортировать по значениям.

Таким образом, отсортированный порядок маркеров останется нетронутым, и порядок карты будет так, как вы хотите, чтобы выходной быть.

осторожности Убедитесь, что алгоритм сортировки вы используете a на месте сортировки algo как Quicksort, в противном случае вышеуказанное решение не будет работать.

Смежные вопросы