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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)