C++中如何给map按值排序

C++中如何给map按值排序,第1张

map按值排序

map的两个值分别为key值和value值,map是按照key值进行排序的,无法直接对value排序。可以将map的key和value组成一个新的结构PAIR,用一个PAIR型的vector存储map中的所有内容,对vecor按照value值进行排序。按顺序输出key。

//map按值排序

#include <iostream>

#include <string>

#include <vector>

#include <map>

#include <algorithm>

using namespace std

typedef pair<string, int> PAIR  

int cmp(const PAIR& x, const PAIR& y)//针对PAIR的比较函数

{  

    return x.second > y.second  //从大到小

}  

int main() {  

  map<string,int> nmap 

  nmap["LiMin"] = 90  

  nmap["ZiLinMi"] = 79  

  nmap["BoB"] = 92  

  nmap.insert(make_pair("Bing",99))  

  nmap.insert(make_pair("Albert",86))  

  //把map中元素转存到vector中   

  vector<PAIR> vec(nmap.begin(),nmap.end())

  sort(vec.begin(), vec.end(), cmp) //排序

 

  for (size_t i = 0 i != vec.size() ++i) {  //输出

       cout << vec[i].first <<" "<<vec[i].second<<endl  

  }  

  return 0  

}

你说的按要求排序,应该是有一些自定义规则排序吧,假如要通过值来排序可以用以下方法: 

Java代码  

 public static void main(String[] args) {  

Map<String, Integer> map = new HashMap<String, Integer>()  

  

map.put("lisi", 5)   

map.put("lisi1", 1)   

map.put("lisi2", 3)   

map.put("lisi3", 9)   

  

List<Map.Entry<String, Integer>> infoIds = new ArrayList<Map.Entry<String, Integer>>(  

        map.entrySet())  

System.out.println("--------------排序前--------------")  

for (int i = 0 i < infoIds.size() i++) {  

    String id = infoIds.get(i).toString()  

    System.out.println(id)  

}  

// 排序  

Collections.sort(infoIds, new Comparator<Map.Entry<String, Integer>>() {  

    public int compare(Map.Entry<String, Integer> o1,  

            Map.Entry<String, Integer> o2) {  

        return ( o1.getValue()-o2.getValue())  

    }  

})  

System.out.println("--------------排序后--------------")  

for (int i = 0 i < infoIds.size() i++) {  

    Entry<String,Integer> ent=infoIds.get(i)  

    System.out.println(ent.getKey()+"="+ent.getValue())  

java.util.TreeMap 放入其中的value,自动按key进行排序, 默认的排序规则按ascii码排序,如果是key是英文和数字不会有问题,如果中文则会出现问题,需要自己写排序规则。

比较器需要实现java.text.Collator类,例如:

package cn.tjopen.mediaman.util

import java.text.CollationKey

import java.text.Collator

public class CollatorComparator extends Collator {

private Collator collator = Collator.getInstance()

private int sort=1

@Override

public int compare(String arg0, String arg1) {

CollationKey key1 = collator.getCollationKey(arg0)

CollationKey key2 = collator.getCollationKey(arg1)

return sort*key1.compareTo(key2)

}

/**

* 设定排序的方向

* @param i 排序方向(正数:正序;负数:倒序)

*/

public void setSort(int i){

if(i>0){

sort=1

}else if(i<0){

sort=-1

}

}

@Override

public CollationKey getCollationKey(String arg0) {

// TODO Auto-generated method stub

return null

}

@Override

public int hashCode() {

// TODO Auto-generated method stub

return 0

}

}

比较器的使用:

int sort = 1//>0正序<0倒叙

CollatorComparator comparator = new CollatorComparator()

comparator.setSort(sort)

Map map = new TreeMap(comparator)

然后在把要排序的字段作为key,相应的信息作为对应的value,即可实现排序

注意:key值不能重复,如果排序字段有重复,则需要进行处理。

例如:方法一:在向map中存放数据时,先判断要放的key是否已存在,如果存在在当前值后面加一区分标记

方法二:如果信息中有不可能重复的字段,在排序字段后面加上这个不重复的字段值,把这个组合当做key


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11755821.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存