根据属性对地图进行排序

时间:2014-05-15 08:33:49

标签: java sorting map

我试图排序:

Map<String,Map<String,Object>> 基于属性(dispSeq)

数据的一个例子是:

ProductType={BeanTag:'xxx',dispSeq=10,.....}

ChargeType={BeanTag:'yyy',dispSeq=30.1,.....}

Something={BeanTag:'zzz',dispSeq=29,.....}

所以,如上所述,我想根据dispSeq对其进行排序。

我知道数据结构不是最好的排序......但是在这一点上,我无法改变它。

我可以通过执行以下操作对“内部”地图进行排序:

private void orderColumns(Map columnDetails) {

    List<Map<String, Object>> columnsValues = new ArrayList<Map<String, Object>>(
            columnDetails.values());

    Collections.sort(columnsValues, new Comparator<Map<String, Object>>() {
        public int compare(Map<String, Object> o1, Map<String, Object> o2) {

            if (Integer.parseInt(o1.get("dispSeq").toString()) == Integer
                    .parseInt(o2.get("dispSeq").toString()))
                return 0;
            return Integer.parseInt(o1.get("dispSeq").toString()) < Integer
                    .parseInt(o2.get("dispSeq").toString()) ? -1 : 1;
        }
    });

}

但是,由于我丢失了主地图的密钥,因此无法正常工作。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

根据我上面的评论,这两种方法可以对地图进行排序。

一眼看上去可能看起来很混乱,但这里的想法是获取条目集并将其转换为列表并使用Collections.sort()方法对列表进行排序。对于外部地图案例,我得到条目集,并在比较方法中从地图中获取第一个元素并进行比较。您可以按照适合自己的方式更改比较逻辑。

我假设你有一个ProductType类型的对象,它有一个字段dispSeq,它是int / Integer。因此,如果您有多个对象,如ProductType,ChargeType等,您可以使用比较实例进行强制转换,也可以使用getDispSeq()方法为所有相关对象创建一个接口;

希望这有帮助。

private static Map<String, Object> sortInnerMap(Map<String, Object> unsortedMap) {

    List<Entry<String, Object>> list = new LinkedList<Entry<String, Object>>(unsortedMap.entrySet());

    Collections.sort(list, new Comparator<Entry<String, Object>>() {
        public int compare(Entry<String, Object> o1, Entry<String, Object> o2) {
            return ((Comparable) ((ProductType) o1.getValue()).getDispSeq())
                                   .compareTo(((ProductType) o2.getValue()).getDispSeq());
        }
    });

    Map<String, Object> sortedMap = new LinkedHashMap<String, Object>();
    for(Entry<String, Object> item : list){
        sortedMap.put(item.getKey(), item.getValue());
    }
    return sortedMap;
}

private static Map<String, Map<String, Object>> sortOuterMap(
        Map<String, Map<String, Object>> unsortedMap) {

    List<Entry<String, Map<String, Object>>> list = new LinkedList<Entry<String, Map<String, Object>>>(
            unsortedMap.entrySet());

    Collections.sort(list,
            new Comparator<Entry<String, Map<String, Object>>>() {
                public int compare(Entry<String, Map<String, Object>> o1,
                        Entry<String, Map<String, Object>> o2) {
                    return ((Comparable) ((ProductType) o1.getValue()
                            .entrySet().iterator().next().getValue())
                            .getDispSeq()).compareTo(((ProductType) o2.getValue()
                            .entrySet().iterator().next().getValue())
                            .getDispSeq());
                }
            });

    Map<String, Map<String, Object>> sortedMap = new LinkedHashMap<String, Map<String, Object>>();
    for(Entry<String, Map<String, Object>> item : list){
        sortedMap.put(item.getKey(), item.getValue());
    }
    return sortedMap;
}

答案 1 :(得分:0)

不要根据内部地图对其进行排序。使用Collections.sort()对外部地图进行排序,并相应地更改比较方法,以从内部地图中获取dispSeq的值,并相应地返回值。