精华内容
下载资源
问答
  • map自定义排序

    千次阅读 2018-05-23 17:20:41
    //对MAP按照值进行自定义排序 List<Map .Entry , Integer>> list = new ArrayList<Map .Entry ,Integer>>(map .entrySet ()) ; System .out .println (list) ; Collections .sort (list, new Comparator<Map...
    package com.test;
    
    import java.text.DateFormat;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Calendar;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.List;
    import java.util.Map;
    import java.util.Map.Entry;
    import java.util.Scanner;
    import java.util.Set;
    
    import sun.util.resources.cldr.CalendarData;
    public class test1 {
    
        public static void main(String[] agrs) throws ParseException{
            Map<String,Integer> map = new HashMap<>();
            map.put("a", 0);
            map.put("b", 1);
            map.put("c", -1);
            Set<String> set = map.keySet();
            for (String string : set) {
                System.out.println(map.get(string));
            }
            //对MAP按照值进行自定义排序  
            List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String,Integer>>(map.entrySet());  
            System.out.println(list);
            Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
    
                @Override
                public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
                    return o1.getValue().compareTo(o2.getValue());
                }
            });
            for (Entry<String, Integer> entry : list) {
                System.out.println(entry.getKey());
            }
        }
    
    }

    输出:
    0
    1
    -1
    [a=0, b=1, c=-1]
    c
    a
    b

    展开全文
  • C++:map自定义排序

    千次阅读 2019-09-19 23:17:54
    今日做leetcode692:前K个高频单词(medium)这道题的时候,本来以为map可以使用直接用sort排序的,然后导致我在oj一直在通过不了,遂在本地ide调试还是编译不通过。甚至我一度怀疑我lambda写错了,然后换了自定义比较...

    前言:
    昨日做leetcode692:前K个高频单词(medium)这道题的时候,本来以为map可以使用直接用sort排序的,后来发现sort排序不能针对关联容器,因为sort会破环关联容器的底层数据结构,详细解释如下。

    map:

    map中的元素是pair类型对象,每个pair类型由关键字—值(key-value)组成:关键字起到索引的作用,值则表示与索引相关联的数据。字典是一个很好的map例子,可以将单词作为关键字,将单词释义作为值。
    map使用的底层数据结构为一颗红黑树(红黑树是一颗高度平衡二叉排序树),因为map的各种操作接口,RB-Tree也都提供了,所以几乎所有的map操作行为,都只是转调用了RB-Tree的操作行为而已。TB-Tree中的key是按弱序排序的,因此map中的key也是按弱序排列的,所以任意更改map的key会严重破坏map组织的,也就是key不能修改(key也就不能使用sort排序。)

    1、map按key排序

    map的模板定义:

    template <class _Key, class _Tp,           
    	 class _Compare __STL_DEPENDENT_DEFAULT_TMPL(less<_Key>),
    	 class _Alloc = __STL_DEFAULT_ALLOCATOR(_Tp) >class map;
    
    • 1)一般情况下,我们定义一个map是直接使用前两个参数的,也就是说我们一般都指定key和value的类型,没有指定Compare类的类型。所以默认情况下,key的类型必须能够进行<运算,且唯一,也就说关键字类型key必须严格弱序
    • 2)当我们使用Compare类来自定义排序关键字类型key的时候,必须要保证“行为正常”的<运算符或>运算符。

    补充:less和greater是两个关系类仿函数,可以用来指定关键字key的顺序,模板如下:

    template <class T> struct less : binary_function <T,T,bool> {  
      bool operator() (const T& x, const T& y) const  
        {return x<y;}  
    };
    template <class T> struct greater : binary_function <T,T,bool> {  
      bool operator() (const T& x, const T& y) const  
        {return x>y;}  
    };  
    

    结论:

    所以当我们打算用map的key排序时,就必须在定义一个map类型对象的时候,指定一个有严格弱序或强序的Compare类。

    //自定义map的key排列顺序
    map<string,int,greater<string>> m1;
    struct myCompare {
     bool operator()(const string& l, const string& r)const
     {
      return l.length() > r.length();
     }
    };
    map<string,int,myCompare> m2;
    

    2、map按value排序

    如何实现Map的按Value排序呢?

    第一反应是利用stl中提供的sort算法实现,这个想法是好的,不幸的是,sort算法有个限制,利用sort算法只能对线性容器进行排序(如vector,list,deque)。map是一个集合容器,它里面存储的元素是pair,不是线性存储的(前面提过,像红黑树),所以利用sort不能直接和map结合进行排序。

    迂回一下,把map中的元素放到序列容器(如vector)中,然后再对这些元素进行排序。要对序列容器中的元素进行排序,也有个必要条件:就是容器中的元素必须是可比较的,也就是实现了<操作的。
    map是元素为pair,其已实现<操作符的重载

    代码如下:

    bool compare(const pair<string,int>& a,const pair<string,int>& b){
    	if(a.second==b.second)return a.first<b.first;
            else return a.second>b.second;
    }
    map<string,int> m{{"a",1},{"b",2},{"c",3}};
    
    vector<pair<string,int>> v(m.begin(),m.end());//将map中的元素拷贝到vector中
    
    sort(v.begin(),v.end(),compare);//实现value的排序
    
    展开全文
  • unordered_map自定义排序

    千次阅读 2020-07-30 17:21:53
    因为unordered_map本身不能使用sort排序(具体因为啥不能,自己搜索哈),因此可以使用以下方法进行自定义排序。(主要是为了自己记忆,老忘记) #include<iostream> #include<algorithm> #include<...

    因为unordered_map本身不能使用sort排序(具体因为啥不能,自己搜索哈),因此可以使用以下方法进行自定义排序。(主要是为了自己记忆,老忘记)

    #include<iostream>
    #include<algorithm>
    #include<vector>
    #include<unordered_map>
    using namespace std;
    int main() {
    	unordered_map<int, int>m;
    	vector<pair<int, int>> vec;
    	for (int i = 0; i < 10; i++) {
    		m[i]++;
    	}
    	//vec.push_back(pair<int, int>(1, 3));
    	//vec.push_back(pair<int, int>(2, 4));
    	//vec.push_back(pair<int, int>(3, 5));
    	//vec.push_back(pair<int, int>(4, 2));
    	//vec.push_back(pair<int, int>(5, 1));
    	for (auto it:m) {
    		vec.push_back(it);
    	}
    	sort(vec.begin(), vec.end(), [](pair<int, int>&a, pair<int, int>&b) {return a.first>b.first; });
    	for (auto it = vec.begin(); it != vec.end(); it++) {
    		cout << it->first<<" "<<it->second << endl;
    	}
    
    	return 0;
    }
    --------------------------------------------------------------/**/或者**
    #include<iostream>
    #include<algorithm>
    #include<vector>
    #include<unordered_map>
    using namespace std;
    bool compare_map(const pair<int, int>&a, const pair<int, int>&b) {
    	return a.first > b.first;
    }
    
    int main() {
    	unordered_map<int, int>m;
    	vector<pair<int, int>> vec;
    	for (int i = 0; i < 10; i++) {
    		m[i]++;
    	}
    	//vec.push_back(pair<int, int>(1, 3));
    	//vec.push_back(pair<int, int>(2, 4));
    	//vec.push_back(pair<int, int>(3, 5));
    	//vec.push_back(pair<int, int>(4, 2));
    	//vec.push_back(pair<int, int>(5, 1));
    	for (auto it:m) {
    		vec.push_back(it);
    	}
    	sort(vec.begin(), vec.end(), compare_map);
    	for (auto it = vec.begin(); it != vec.end(); it++) {
    		cout << it->first<<" "<<it->second << endl;
    	}
    
    	return 0;
    }
    
    展开全文
  • c++ map自定义排序

    千次阅读 2015-01-24 01:29:22
    c++map简单排序

    在c++中用到map时,如果key是自定义的struct,那么需要自己定义比较函数。因为只有基本类型有默认的比较方法。

    typedef struct myKey
    {
    	int nId;
    	int nVersion;
    	int nNote;
    }myKey;
    
    ///自定义map的value
    typedef struct myValue
    {
    	string strText;
    }myValue;
    
    struct cmp_key
    {
    	bool operator()(const myKey &k1,const myKey &k2) const
    	{
    		if(k1.nId != k2.nId)
    		{
    			return k1.nId < k2.nId;
    		}
    
    		if(k1.nVersion != k2.nVersion)
    		{
    			return k1.nVersion < k2.nVersion;
    		}
    
    		if(k1.nNote != k2.nNote)
    		{
    			return k1.nNote < k2.nNote;
    		}
    
    		return false;
    	}
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	map<myKey,myValue,cmp_key> mymap;
    	myKey k1;
    	k1.nId = 1;
    	k1.nVersion = 2;
    	k1.nNote = 3;
    	myValue v1;
    	v1.strText = "k1: id=1 version=2 note=3";
    
    	myKey k2;
    	k2.nId = 2;
    	k2.nVersion = 2;
    	k2.nNote = 3;
    	myValue v2;
    	v2.strText = "k1: id=2 version=2 note=3";
    
    	myKey k3;
    	k3.nId = 2;
    	k3.nVersion = 2;
    	k3.nNote = 5;
    	myValue v3;
    	v3.strText = "k1: id=2 version=2 note=5";
    
    	mymap[k1] = v1;
    	mymap[k2] = v2;
    	mymap[k3] = v3;
    
    	for(auto it = mymap.begin(); it != mymap.end(); ++it)
    	{
    		cout << it->second.strText.c_str() << endl;
    	}
    	return 0;
    }
    
    输出:

    k1: id=1 version=2 note=3
    k1: id=2 version=2 note=3
    k1: id=2 version=2 note=5
    对value排序的话,用vector<pair>代替。

    展开全文
  • STL-set-map自定义排序

    2020-11-19 13:33:12
    1.4 map与set自定义排序 1. 方法一 重载< #include <iostream> #include <set> #include <map> using namespace std; struct node { int x; bool operator<(const node y) const { ...
  • 对sort和map,set的排序规则做了个小小的讨论
  • Java List、Map自定义排序

    千次阅读 2019-05-09 20:54:41
    1、List自定义排序 自定以实现List的sort()方法 举例:有类型为Document的ArrayList,Document有属性count,按照count的大小排序。 List<Document> ipInfoList = new ArrayList<>(); //省略初始化模拟...
  • 1.sort自定义排序返回true的理解 sort(first,last,cmp) bool cmp(const int& a,cosnt int& b) { return a<b; 1 //return b<a; 2 } 可以把参数中的a,b理解为从数组中顺序提取的两个数。这两个数的...
  • map自定义排序规则

    千次阅读 2018-01-06 17:22:14
    //自定义map键值的排序规则,此处是为了让string的比较得出int比较的效果 }; int main() { map < string , int , comp> m_map; m_map.insert(pair< string , int >( "100" , 1 )); m_map.insert(pair< ...
  • Map.Entry<String, RxGraphVO.SlbNode.SlbItem>> comp = Comparator.comparingInt(item -> item.getValue().getPercent()); Map<String, RxGraphVO.SlbNode.SlbItem> map = Maps.newHashMap(); ...
  • std::map 自定义排序

    2016-05-04 10:10:00
    PS:开发中难免会用到快速检索的数据结构-map , 很多时候map自身提供的排序不能满足我们的需要或者不支持我们自定的数据结构的排序,解决办法就是自己实现排序. 这里的小案例是:我们要经用户的hash数据和所对应...
  • 起因:前缀相同、后半部分为递增数字的std::string作为Map的key时希望按数字部分的大小排序,如预期排序为item0, item1,...item9, item10... 目标:用仿函数实现以std::string作为key的map自定义排序  实现: class
  • C++ map 自定义排序规则

    千次阅读 2012-09-27 00:03:59
    map的模板定义第三个参数,即为我们的排序规则。 默认是试用std::less 如果我们想对key (string)不区分大小写进行排序,可以这样写。 #include "stdafx.h" #include #include #include #include #...
  • 比如针对STL MAP的KEY按照字符串长度排序,网上是这么写的 struct CmpByKeyLength { bool operator()(const string&amp; k1, const string&amp; k2) { return k1.length() &lt; k2.length(); } ...
  • map自定义排序,根据键或者值排队

    千次阅读 2018-12-16 21:36:41
    比较器之根据键排序 package cn.com.hongyitech.accountsystem.utils; import java.util.Comparator; class MapKeyComparator implements Comparator&lt;String&gt;{ @Override public int compare...
  • 会自动从小到大排序,但是很多时候需要按特定方式进行排序,所以如何自定义排序就很重要了!!! #include using namespace std; struct cmp { bool operator()(const string &k1,const string &k2) { ...
  • map自定义排序

    千次阅读 2018-11-29 08:53:42
    由于需要用到map自定义排序,所以去学习了下,一起分享给大家看看,自定义排序的关键在于下列代码的自定义函数的cmp里面,可以选择自己想要的排序方式,我这个的自定义排序是先根据value的降序进行排序,如果遇到...
  • map基本概念及其特性 map构造函数 map插入数据元素操作(重点) map大小和赋值操作 map删除操作 map查找操作 map自定义排序(待补充整理)
  • 很容易想到用map存储,找到数量最多、单词词典顺序较小的那个词需要用到map自定义排序map自定义排序是通过将map转换成vector<pair<temp1 temp2>>,然后使用sort函数处理的。关于map的排序可以...
  • C++ STL map自定义排序

    千次阅读 2019-01-26 23:38:45
    map分别按value或key排序两种情况
  • Java的Set、Map和数组的自定义排序 该文章讲述下面三点并给出相应实例 Set的三种自定义排序和遍历 Map的三种自定义排序和遍历 数组的三种自定义排序 1.Set的三种自定义排序和遍历 这里的三种自定义排序分别是 ...
  • Java中Map自定义排序

    千次阅读 2015-01-13 20:13:53
    * map自定义排序操作 * @author admin * */ public class MapSorting { /** * 根据map的值进行降序排列 * 1 注意要讲map.entrySet转化成list * 2 注意使用比较函数,并且使用匿名类实现。 * 3 理解时...
  • List<Map> 自定义排序

    2013-02-21 20:32:13
    对list根据自定义方法排序记要 Java代码 List list = dao.findAllToMap();//得到所有数据,结果封装成List ComparatorArea comparator = new ComparatorArea();... /** * 对区块自定义排序,顺序从

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 103,967
精华内容 41,586
关键字:

map自定义排序