我有一张地图(这直接来自网络服务,因此无论如何输入都是地图)我试图根据描述对地图进行排序。但是,两个键有空描述,现在无论如何都需要它们。当我排序时,一个密钥丢失,一个密钥具有空描述。这是我的代码
public class TestArabic {
public static void main(String[] args) {
Map<Integer, NationalityDto> m = new HashMap<Integer, NationalityDto>();
NationalityDto n10 = new NationalityDto();
n10.setNatid(110);
n10.setDesc("");
m.put(110, n10);
NationalityDto n2 = new NationalityDto();
n2.setNatid(102);
n2.setDesc("الهند");
m.put(102, n2);
NationalityDto n3 = new NationalityDto();
n3.setNatid(103);
n3.setDesc("سعودي");
m.put(103, n3);
NationalityDto n1 = new NationalityDto();
n1.setNatid(101);
n1.setDesc("مصر");
m.put(101, n1);
NationalityDto n4 = new NationalityDto();
n4.setNatid(104);
n4.setDesc("الكويت");
m.put(104, n4);
NationalityDto n5 = new NationalityDto();
n5.setNatid(105);
n5.setDesc("لبنان");
m.put(105, n5);
NationalityDto n6 = new NationalityDto();
n6.setNatid(106);
n6.setDesc("");
m.put(106, n6);
System.out.println("Actual map");
System.out.println(m);
Map<Integer, NationalityDto> sortedMap = sortByValue(m);
System.out.println("About to sort the map");
System.out.println(sortedMap);
List<NationalityDto> list = new ArrayList<>();
//Add elements
for(Map.Entry<Integer, NationalityDto> m1 : sortedMap.entrySet()) {
list.add(m1.getValue());
}
Collections.sort(list, (e1, e2) -> e1.getDesc().compareTo(e2.getDesc()));
Map<Integer, NationalityDto> map = new LinkedHashMap<>();
for(NationalityDto dto : list){
map.put(dto.getNatid(), dto);
}
System.out.println("Sorted map");
System.out.println(map);
}
private static Map<Integer, NationalityDto> sortByValue(Map m) {
Map<Integer, NationalityDto> sortedMap = new TreeMap(new ValueComparator(m));
sortedMap.putAll(m);
return sortedMap;
}
}
class ValueComparator implements Comparator<Integer> {
Map<Integer, NationalityDto> map;
public ValueComparator(Map map) {
this.map = map;
}
public int compare(Integer s1, Integer s2) {
// TODO Auto-generated method stub
return ((NationalityDto) map.get(s1)).getDesc().compareTo(((NationalityDto) map.get(s2)).getDesc());
}
}
{101=NationalityDto [natid=101, desc=مصر], 102=NationalityDto [natid=102, desc=الهند], 103=NationalityDto [natid=103, desc=سعودي], 104=NationalityDto [natid=104, desc=الكويت], 105=NationalityDto [natid=105, desc=لبنان], 106=NationalityDto [natid=106, desc=], 110=NationalityDto [natid=110, desc=]}
About to sort the map
{106=NationalityDto [natid=110, desc=], 104=NationalityDto [natid=104, desc=الكويت], 102=NationalityDto [natid=102, desc=الهند], 103=NationalityDto [natid=103, desc=سعودي], 105=NationalityDto [natid=105, desc=لبنان], 101=NationalityDto [natid=101, desc=مصر]}
Sorted map
{110=NationalityDto [natid=110, desc=], 104=NationalityDto [natid=104, desc=الكويت], 102=NationalityDto [natid=102, desc=الهند], 103=NationalityDto [natid=103, desc=سعودي], 105=NationalityDto [natid=105, desc=لبنان], 101=NationalityDto [natid=101, desc=مصر]}
现在缺少106键。
答案 0 :(得分:5)
你无法按值对TreeMap
进行排序。任何告诉你的人都错了,而你使用的价值比较器已被破坏。
按值排序地图的唯一有效方法是您在main
方法中使用的方法:将条目排序为列表并转储到LinkedHashMap
。
for(Map.Entry<Integer, NationalityDto> m1 : sortedMap.entrySet()) {
list.add(m1.getValue());
}
Collections.sort(list, (e1, e2) -> e1.getDesc().compareTo(e2.getDesc()));
Map<Integer, NationalityDto> map = new LinkedHashMap<>();
for(NationalityDto dto : list){
map.put(dto.getNatid(), dto);
如果你没有首先给它一个破碎的地图,这部分将对这些条目进行排序。您的sortByValue
方法已被破坏;不要使用它。