【问题标题】:How to Sort the list by frequency in a descending order如何按频率降序对列表进行排序
【发布时间】:2025-04-05 08:25:02
【问题描述】:

我已经完成了多次搜索后找到前 20 个单词的代码,但它不是降序单词。 如果两个单词具有相同的数字帐户,我需要添加代码以按频率降序排序列表:

{ '猫' => 43, 'c' => 43 }

输出应该是

c

我的代码是:

 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());
        }
    });

或者有更好的想法如何按降序获得频率?!

感谢您的帮助。

【问题讨论】:

    标签: java sorting hashmap


    【解决方案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());
    

    【讨论】:

    • 添加代码后出现错误,需要创建 toList() 方法。您能否说明应该在我的代码中添加哪一部分。从逻辑上讲,我不知道它是如何工作的。
    • 我添加了必要的导入
    • 另外,您能否更具体地说明您期望的输出顺序?
    • 假设我们有以 top 2 为例的输出:“cat:37, c:37”我需要添加额外的代码来以这种方式排序(数字降序,词汇升序)。这意味着输出将是:“c:37,cat:37”,第一个是“c”,第二个是列表中的“cat”,依此类推。
    • 假设前 20 名的输出没有排序:"apple:40","a:40","cat:37","c:37",,, 输出排序:"a :40","苹果:40","c:37","cat:37"。 -----> 输出应该是这个。
    【解决方案2】:

    您需要做的是对地图进行排序。据我了解,您想要前 20 个值,如果两个值具有相同的标记,那么它应该按字典顺序排列。

    我的解决方案是首先按键(在您的情况下为令牌)对您的地图进行排序,然后 然后 按值排序。

    这样,标记的排序顺序将保持不变,并且映射顺序将按照您希望输出的方式。

    注意 确保您使用的排序算法是 就地排序算法,如 Quicksort,否则上述解决方案将不起作用。

    【讨论】:

      最近更新 更多