根据Map的value排序

本文介绍了一种使用Java对字符按照其出现频率进行排序的方法。通过将Map<Character,Integer>转换为List并利用Collections.sort结合自定义Comparator实现。此外,还展示了如何用lambda表达式简化代码。

需要对Map<Character, Integer> 类型的数据根据value值进行排序,思路,将所有元素先放到List中,使用Collection接口的sort进行排序。

如有


String s = "abchhhhhhhhhj";
Map<Character, Integer> fre = new HashMap<>();
int len = s.length();

for (int i = 0; i < len; i++) {
    int count = fre.getOrDefault(s.charAt(i), 0) + 1;
    fre.put(s.charAt(i), count);
}
List<Map.Entry<Character, Integer>> List = new ArrayList<Map.Entry<Character, Integer>>(fre.entrySet());
Collections.sort(List, new Comparator<Map.Entry<Character, Integer>>() {
    @Override
    public int compare(Map.Entry<Character, Integer> o1, Map.Entry<Character, Integer> o2) {
        return o2.getValue() - o1.getValue();
    }
});
StringBuilder sb = new StringBuilder();
Character c;
int nums;
for (int i = 0; i < List.size(); i++) {
    c = List.get(i).getKey();
    nums = List.get(i).getValue();
    for (int j = 0; j < nums; j++) {
        sb.append(c);
    }
    //System.out.println("character " + c + " nums " + nums);
}
String result = sb.toString();

根据value排序,实现了字符串按字符出现的次数进行降序排序,得到新的字符串。


上面核心代码为:

Collections.sort(List, new Comparator<Map.Entry<Character, Integer>>() {
    @Override
    public int compare(Map.Entry<Character, Integer> o1, Map.Entry<Character, Integer> o2) {
        return o2.getValue() - o1.getValue();
    }
});

其实更加简洁可以用一行代码来实现:使用lamda表达式

List.sort((Map.Entry<Character, Integer> o1, Map.Entry<Character, Integer> o2)->(o2.getValue() - o1.getValue()));

### 如何根据 MapValue 进行排序 #### Java 实现 在 Java 中,可以通过 `TreeMap` 或者自定义比较器来实现基于值的排序。以下是通过创建一个新的列表并对其进行排序的方式: ```java import java.util.*; public class SortByValue { public static void main(String[] args) { Map<String, Integer> map = new HashMap<>(); map.put("a", 10); map.put("b", 5); map.put("c", 7); List<Map.Entry<String, Integer>> list = new ArrayList<>(map.entrySet()); // 使用 Comparator 对 value 排序 Collections.sort(list, (o1, o2) -> o1.getValue().compareTo(o2.getValue())); // 将排序后的结果放入 LinkedHashMap Map<String, Integer> sortedMap = new LinkedHashMap<>(); for (Map.Entry<String, Integer> entry : list) { sortedMap.put(entry.getKey(), entry.getValue()); } System.out.println(sortedMap); // 输出按 value 排序的结果 } } ``` 此方法利用了 `Collections.sort()` 和 Lambda 表达式[^1]。 --- #### C++ 实现 在 C++ 中,可以使用 `std::vector<std::pair>` 来存储键值对,并对其按照值进行排序。以下是一个示例代码: ```cpp #include <iostream> #include <vector> #include <algorithm> #include <unordered_map> using namespace std; int main() { unordered_map<string, int> umap; umap["a"] = 10; umap["b"] = 5; umap["c"] = 7; vector<pair<string, int>> vec(umap.begin(), umap.end()); // 自定义排序函数,按 value 升序排列 sort(vec.begin(), vec.end(), [](const pair<string, int>& a, const pair<string, int>& b) { return a.second < b.second; }); for (auto& p : vec) { cout << p.first << ": " << p.second << endl; } return 0; } ``` 这里使用了 `sort()` 函数以及 Lambda 表达式来自定义排序逻辑。 --- #### Python 实现 在 Python 中,可以直接使用内置的 `sorted()` 方法对字典项进行排序。以下是一个简单的例子: ```python from operator import itemgetter data = {"a": 10, "b": 5, "c": 7} # 按照 value 排序 sorted_data = dict(sorted(data.items(), key=itemgetter(1))) print(sorted_data) # 输出按 value 排序的结果 ``` 或者也可以使用 Lambda 表达式作为排序的关键字参数: ```python data = {"a": 10, "b": 5, "c": 7} # 使用 lambda 表达式排序 sorted_data = {k: v for k, v in sorted(data.items(), key=lambda item: item[1])} print(sorted_data) # 输出按 value 排序的结果 ``` 上述两种方式均实现了基于值的排序操作。 --- ### 总结 不同编程语言提供了多种工具和库支持对映射结构(如 `map`, `dict`)中的值进行排序。无论是 Java 的 `Comparator`、C++ 的 `std::sort`,还是 Python 的 `sorted()`,都可以高效完成这一任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值