`
zdk8105
  • 浏览: 37914 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

TreeMap比较器实现方式二(根据值与键结合起来排序)

 
阅读更多
1. 比较器实现
/**
 * TreeMap比较器(根据键值结合排序)
 *
 */
public class ByValueComparator  implements Comparator<Entry<String, Map<String,String>>>{
 private Map<String,Integer> bankCodeMap = new HashMap<String,Integer>();
 private Map<String,Integer> valueMap = new HashMap<String,Integer>();
 private int bankWeight = 0;
 private int B2BWeight = 0;
 
 
 public ByValueComparator(){
     bankCodeMap.put("ICBC", 1);
  bankCodeMap.put("CCB", 2);
  bankCodeMap.put("ABC", 3);
    }
   
 @Override
 public int compare(Entry<String, Map<String, String>> o1,
   Entry<String, Map<String, String>> o2) {
  Map<String,String> value1 = o1.getValue();
  Map<String,String> value2 = o2.getValue();
  
  if(olnyContainsB2B(value1) && olnyContainsB2B(value2)){
   
   return getB2BWeight(o1.getKey()) - getB2BWeight(o2.getKey());
  }else if(olnyContainsB2B(value1) || olnyContainsB2B(value2)){
   if(olnyContainsB2B(value1)){
    return 1;
   }else{
    return -1;
   }
  }else{
   return getBankWeight(o1.getKey()) - getBankWeight(o2.getKey());
  }
 }
 /**
  * 判断是否只包含B2B
  * @param map
  * @return
  */
 private boolean olnyContainsB2B(Map<String,String> map){
  boolean flag = false;
  if(map ==  null){
   return flag;
  }
  if(map.size() == 1 && map.get("20") != null){
   flag = true;
  }
  return flag;
 }
 
 /**
  * 获取B2B权重
  * @param key
  * @return
  */
 private int getB2BWeight(String key){
  Integer value = valueMap.get(key);
  if(value == null){
   value = B2BWeight;
   valueMap.put(key, value);
   B2BWeight++;
  }
  return value;
 }
   
 /**
  * 获取银行代码权重
  * @param key
  * @return
  */
 private int getBankWeight(String key){
  Integer value = bankCodeMap.get(key);
  if(value == null){
   if(bankWeight == 0){
    bankWeight = Collections.max(bankCodeMap.values()) + 1;
   }else{
    bankWeight = bankWeight + 1;
   }
   
   value = bankWeight;
   bankCodeMap.put(key, value);
  }
  return value;
 }
}
2.测试代码
TreeMap<String,Map<String,String>> treeMap = new TreeMap<String,Map<String,String>>();
  Map<String,String> map1 = new HashMap<String,String>();
  map1.put("10", "B2C_map1");
  map1.put("20", "B2B_map1");
  
  Map<String,String> map2 = new HashMap<String,String>();
  map2.put("20", "B2B_map2");
  
  Map<String,String> map3 = new HashMap<String,String>();
  map3.put("20", "B2B_map3");
  
  Map<String,String> map4 = new HashMap<String,String>();
  map4.put("13", "Express_map4");
  
  treeMap.put("UOP", map1);
  treeMap.put("HP", map2);
  treeMap.put("ICBC", map3);
  treeMap.put("ABC", map4);
  treeMap.put("CCB", map1);
  treeMap.put("GDB", map3);
  
   ByValueComparator bvc  = new ByValueComparator();
         List<Entry<String, Map<String,String>>> newList=new ArrayList<Entry<String, Map<String,String>>>(treeMap.entrySet());
         Collections.sort(newList, bvc);
         for(Map.Entry<String, Map<String,String>> tempMap:newList){
          System.out.println(tempMap);
         }
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Java里多个Map的性能比较(TreeMap、HashMap、ConcurrentSkipListMap)

    - **特性**:TreeMap的键值对是有序的,可以通过键的自然顺序或自定义比较器进行排序,适合需要有序遍历的场景。 - **性能分析**:在插入和查找操作中,随着数据量的增加,TreeMap的性能逐渐下降,尤其是在大规模...

    HashMap集合排序

    `TreeMap` 是基于红黑树数据结构实现的,它会根据键的自然顺序或者自定义比较器来自动排序键值对。 在给定的场景中,我们需要创建一个 `Car` 类,包含两个属性:`model`(型号) 和 `speed`(速度)。然后,我们将使用 ...

    Hashmap 通过对VALUE排序 源代码

    1. 使用TreeMap:TreeMap是一个有序的Map实现,它基于红黑树数据结构,可以按照键或自定义比较器对元素进行排序。如果你需要对值进行排序,可以创建一个基于Value的Comparator,然后用这个Comparator构建一个新的...

    联系人排序功能的实现

    在这个场景中,我们关注的是如何利用比较器(Comparator)来实现联系人列表的动态排序,既可以按姓名,也可以按电话号码进行排列。 首先,联系人数据通常存储在List或其他类型的集合中,每个联系人对象包含姓名和...

    对map里面的value进行排序

    Map接口不直接支持排序,但是Java提供了一些实现了SortedMap接口的类,如TreeMap,它会按照键(Key)的自然顺序或者自定义比较器(Comparator)进行排序。但是,对于已经创建的HashMap或其他非排序Map,我们不能直接...

    Java集合排序及java集合类详解

    TreeMap则使用红黑树结构,元素按照键的自然排序或自定义比较器排序。 在Java集合排序方面,我们主要关注List和Map。对于List,可以使用Collections.sort()方法进行排序,这个方法默认使用元素的自然顺序,如果元素...

    java 集合 分析比较

    - **`TreeMap`**:基于红黑树实现的有序映射,按照键的自然顺序或自定义比较器排序。 ##### 4. `SortedMap` 接口 - **定义**:`SortedMap` 继承自 `Map`,进一步保证其键值对将按照递增顺序排序,排序依据为键的...

    java比较器的常见用法[借鉴].pdf

    `Comparable`接口只包含一个方法:`compareTo()`,它接受一个与当前对象同类型的参数,并根据比较结果返回一个整数值。 `compareTo()`方法的返回值决定了比较对象之间的相对顺序。当当前对象大于传入的对象时,返回...

    Java集合排序及java集合类详解参照.pdf

    Map中的键通常是可比较的,实现了Comparable接口的类的实例可以作为键,这样Map可以根据键的自然顺序进行排序。例如,使用TreeMap时,如果不提供Comparator,键将按照其天然顺序排序。 **5. 集合排序** Java集合...

    map实现按value升序排序

    而`TreeMap`实现了`SortedMap`接口,可以按自然排序或自定义比较器进行排序。 要对`Map`按照值排序,我们可以使用以下步骤: 1. 获取`Map`的所有`Entry`(键值对)并放入一个数组。 2. 创建一个`Comparator`对象,...

    DictionarySort:实现排序和搜索方法

    1. **基于键的排序**:如果字典是HashMap,由于HashMap不保持任何特定的顺序,我们可以将其转换为TreeMap,因为TreeMap按照键的自然顺序(或自定义比较器)进行排序。对于自定义类作为键,需要实现Comparable接口或...

    Java(Collection_List_Map_Set).rar_java集合类详解

    TreeMap的键按自然排序或自定义比较器排序,而LinkedHashMap保持了插入顺序或访问顺序。 至于Java集合的排序,有两种主要方式。一种是通过实现Comparable接口,让集合内的元素自定义排序规则。另一种是使用...

    Java_Collection_List-Set-Map.zip_list set map

    - 对于Map,可以使用TreeMap并提供自定义比较器,或者通过Collections.sort()方法和Map.Entry来排序Map的键或值。 5. **遍历**: - List可以使用for-each循环,迭代器或者索引下标进行遍历。 - Set通常使用迭代...

    Java面试题

    它能够根据元素的自然顺序或自定义的比较器对元素进行排序。`TreeSet`提供了排序和范围查询的功能,但相对于`HashSet`来说,其性能略低。 #### Map的三个实现类 `Map`接口提供了一种将键映射到值的存储方式。每个...

    Java集合排序及java集合类详解.pdf

    - **实现原理**:HashMap使用哈希表实现快速查找,TreeMap基于红黑树保持键的排序,LinkedHashMap则结合了HashMap和链表的特点,保证了插入顺序或访问顺序。 通过对Java集合框架的深入理解,开发者可以更有效地...

    java中三种集合set、map、list的区别与联系

    键按自然顺序或自定义比较器排序。 - **`LinkedHashMap`**:保留了`HashMap`的高效性,同时维护了键值对的插入顺序或访问顺序。 ### List `List`是一种有序的集合,允许重复元素,提供了基于位置的元素访问。主要...

    【IT十八掌徐培成】Java基础第13天-01.Map的迭代方式.zip

    HashMap和TreeMap的迭代性能不同,HashMap的迭代速度通常较快,因为它是无序的,而TreeMap的迭代顺序是由键的自然排序或比较器决定的,所以可能会慢一些。此外,如果你需要在迭代过程中修改Map,务必使用Iterator的...

    Java容器简图.docx

    - `TreeSet`:实现了`SortedSet`接口,内部使用`TreeMap`,元素按自然顺序或自定义比较器进行排序。 - `LinkedHashSet`:结合了`HashSet`的性能和`LinkedList`的顺序特性,保持了插入顺序,也可以按照访问顺序排序...

    set,list,map区别与联系

    - **TreeMap**:基于红黑树实现的 Map,可以自动按照键的自然顺序或自定义比较器排序。 - **LinkedHashMap**:维护元素的插入顺序,同时提供 HashMap 的高效性。 ##### Map的关键概念 - **键**:必须是唯一的,...

    Java-集合的例题 & 例题源码 & PPT教学文档(黑马程序员详细版).rar

    TreeMap内部实现为红黑树,保持键的排序,有序且支持根据键或值进行范围查询。 接下来,我们关注Java集合的例题。这些例题通常会涉及集合的创建、添加元素、删除元素、遍历、查找、集合转换等操作。例如,如何在已...

Global site tag (gtag.js) - Google Analytics