基于阿拉伯语desc的地图排序使用java无法正常工作

时间:2017-02-19 18:14:02

标签: java sorting hashmap arabic

美好的一天

我试图根据阿拉伯语desc对地图进行排序,这是dto中的一个字段。但是在排序时没有删除其中一个地图对象。所有键都不同。这是我的代码

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(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键有110个对象。任何想法

更新:

现在缺少106键。

2 个答案:

答案 0 :(得分:1)

您在示例中使用的HashMap在检索元素时不保证任何顺序,因此无论如何您都不会按预期顺序获取元素。

所以,我会提出以下几点:

  • 将元素存储在列表
  • 对列表进行排序
  • 创建linkedHashMap并添加所有元素

以下是一个例子;

List<NationalityDto> list = new ArrayList<>();

//Add elements

Collections.sort(list, (e1, e2) -> e1.getDesc().compareTo(e2.getDesc()));

Map<Integer, NationalityDto> map = new LinkedHashMap<>();

for(NationalityDto dto : list){
    map.put(dto.getId(), dto);
}

答案 1 :(得分:0)

提示设计:

在地图键和Dto中使用相同的ID存在重复数据,因此,如果它们是唯一的,为什么不使用DTO列表或集合。

列表示例:

    List<NationalityDto> list = new ArrayList<>();
    list.add(new NationalityDto(110, ""));
    list.add(new NationalityDto(102, "الهند"));
    list.add(new NationalityDto(103, "سعودي"));
    list.add(new NationalityDto(101, "مصر"));
    list.add(new NationalityDto(104, "الكويت"));
    list.add(new NationalityDto(105, "لبنان"));
    list.add(new NationalityDto(106, ""));

    list.sort(Comparator.comparing(NationalityDto::getDesc));

    System.out.println(list);

SortedSet示例:

    SortedSet<NationalityDto> set = new TreeSet<>(Comparator.comparing(NationalityDto::getDesc));
    set.add(new NationalityDto(110, ""));
    set.add(new NationalityDto(102, "الهند"));
    set.add(new NationalityDto(103, "سعودي"));
    set.add(new NationalityDto(101, "مصر"));
    set.add(new NationalityDto(104, "الكويت"));
    set.add(new NationalityDto(105, "لبنان"));
    set.add(new NationalityDto(106, ""));

    System.out.println(set);

并且在SortedSet中你不需要对集合进行排序,它已经在每次插入操作后排序