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);
}
分享到:
相关推荐
- **特性**:TreeMap的键值对是有序的,可以通过键的自然顺序或自定义比较器进行排序,适合需要有序遍历的场景。 - **性能分析**:在插入和查找操作中,随着数据量的增加,TreeMap的性能逐渐下降,尤其是在大规模...
`TreeMap` 是基于红黑树数据结构实现的,它会根据键的自然顺序或者自定义比较器来自动排序键值对。 在给定的场景中,我们需要创建一个 `Car` 类,包含两个属性:`model`(型号) 和 `speed`(速度)。然后,我们将使用 ...
1. 使用TreeMap:TreeMap是一个有序的Map实现,它基于红黑树数据结构,可以按照键或自定义比较器对元素进行排序。如果你需要对值进行排序,可以创建一个基于Value的Comparator,然后用这个Comparator构建一个新的...
在这个场景中,我们关注的是如何利用比较器(Comparator)来实现联系人列表的动态排序,既可以按姓名,也可以按电话号码进行排列。 首先,联系人数据通常存储在List或其他类型的集合中,每个联系人对象包含姓名和...
Map接口不直接支持排序,但是Java提供了一些实现了SortedMap接口的类,如TreeMap,它会按照键(Key)的自然顺序或者自定义比较器(Comparator)进行排序。但是,对于已经创建的HashMap或其他非排序Map,我们不能直接...
TreeMap则使用红黑树结构,元素按照键的自然排序或自定义比较器排序。 在Java集合排序方面,我们主要关注List和Map。对于List,可以使用Collections.sort()方法进行排序,这个方法默认使用元素的自然顺序,如果元素...
- **`TreeMap`**:基于红黑树实现的有序映射,按照键的自然顺序或自定义比较器排序。 ##### 4. `SortedMap` 接口 - **定义**:`SortedMap` 继承自 `Map`,进一步保证其键值对将按照递增顺序排序,排序依据为键的...
`Comparable`接口只包含一个方法:`compareTo()`,它接受一个与当前对象同类型的参数,并根据比较结果返回一个整数值。 `compareTo()`方法的返回值决定了比较对象之间的相对顺序。当当前对象大于传入的对象时,返回...
Map中的键通常是可比较的,实现了Comparable接口的类的实例可以作为键,这样Map可以根据键的自然顺序进行排序。例如,使用TreeMap时,如果不提供Comparator,键将按照其天然顺序排序。 **5. 集合排序** Java集合...
而`TreeMap`实现了`SortedMap`接口,可以按自然排序或自定义比较器进行排序。 要对`Map`按照值排序,我们可以使用以下步骤: 1. 获取`Map`的所有`Entry`(键值对)并放入一个数组。 2. 创建一个`Comparator`对象,...
1. **基于键的排序**:如果字典是HashMap,由于HashMap不保持任何特定的顺序,我们可以将其转换为TreeMap,因为TreeMap按照键的自然顺序(或自定义比较器)进行排序。对于自定义类作为键,需要实现Comparable接口或...
TreeMap的键按自然排序或自定义比较器排序,而LinkedHashMap保持了插入顺序或访问顺序。 至于Java集合的排序,有两种主要方式。一种是通过实现Comparable接口,让集合内的元素自定义排序规则。另一种是使用...
- 对于Map,可以使用TreeMap并提供自定义比较器,或者通过Collections.sort()方法和Map.Entry来排序Map的键或值。 5. **遍历**: - List可以使用for-each循环,迭代器或者索引下标进行遍历。 - Set通常使用迭代...
它能够根据元素的自然顺序或自定义的比较器对元素进行排序。`TreeSet`提供了排序和范围查询的功能,但相对于`HashSet`来说,其性能略低。 #### Map的三个实现类 `Map`接口提供了一种将键映射到值的存储方式。每个...
- **实现原理**:HashMap使用哈希表实现快速查找,TreeMap基于红黑树保持键的排序,LinkedHashMap则结合了HashMap和链表的特点,保证了插入顺序或访问顺序。 通过对Java集合框架的深入理解,开发者可以更有效地...
键按自然顺序或自定义比较器排序。 - **`LinkedHashMap`**:保留了`HashMap`的高效性,同时维护了键值对的插入顺序或访问顺序。 ### List `List`是一种有序的集合,允许重复元素,提供了基于位置的元素访问。主要...
HashMap和TreeMap的迭代性能不同,HashMap的迭代速度通常较快,因为它是无序的,而TreeMap的迭代顺序是由键的自然排序或比较器决定的,所以可能会慢一些。此外,如果你需要在迭代过程中修改Map,务必使用Iterator的...
- `TreeSet`:实现了`SortedSet`接口,内部使用`TreeMap`,元素按自然顺序或自定义比较器进行排序。 - `LinkedHashSet`:结合了`HashSet`的性能和`LinkedList`的顺序特性,保持了插入顺序,也可以按照访问顺序排序...
- **TreeMap**:基于红黑树实现的 Map,可以自动按照键的自然顺序或自定义比较器排序。 - **LinkedHashMap**:维护元素的插入顺序,同时提供 HashMap 的高效性。 ##### Map的关键概念 - **键**:必须是唯一的,...
TreeMap内部实现为红黑树,保持键的排序,有序且支持根据键或值进行范围查询。 接下来,我们关注Java集合的例题。这些例题通常会涉及集合的创建、添加元素、删除元素、遍历、查找、集合转换等操作。例如,如何在已...