Java 基于属性对映射的映射进行排序

Java 基于属性对映射的映射进行排序,java,sorting,map,Java,Sorting,Map,我正在尝试排序一个: Map 基于属性(dispSeq) 数据的一个例子是: ProductType={BeanTag:'xxx',dispSeq=10,.....} ChargeType={BeanTag:'yyy',dispSeq=30.1,.....} Something={BeanTag:'zzz',dispSeq=29,.....} 因此,如上所述,我想根据dispSeq对其进行排序 我知道数据结构不是执行排序的最佳方式。。。但在这一点上,我无法改变它 我可以通过以下操作对“内部

我正在尝试排序一个:

Map
基于属性
(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;
        }
    });

}
private void orderColumns(映射列详细信息){
列表列值=新的ArrayList(
columnDetails.values());
Collections.sort(columnsValues,newcomparator(){
公共整数比较(映射o1,映射o2){
if(Integer.parseInt(o1.get(“dispSeq”).toString())==Integer
.parseInt(o2.get(“dispSeq”).toString())
返回0;
返回Integer.parseInt(o1.get(“dispSeq”).toString())
但这不起作用,因为我丢失了主地图的钥匙


有什么想法吗?

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

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

乍一看可能会令人困惑,但这里的想法是获取条目集并将其转换为列表,然后使用
Collections.sort()
方法对列表进行排序。对于外部映射的情况,我获取条目集,并使用比较方法从映射中获取第一个元素并进行比较。您可以按照适合自己的方式更改比较逻辑

我假设您有一个类型为
ProductType
的对象,它有一个字段
dispSeq
,它是int/Integer。因此,如果您有多个对象,如ProductType、ChargeType等,您可以创建用于强制转换的Comparison实例,或者使用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;
}
private static Map sortinenermap(Map unsortedMap){
List List=newlinkedlist(unsortedMap.entrySet());
Collections.sort(list,newcomparator(){
公共整数比较(条目o1、条目o2){
返回((可比较)((ProductType)o1.getValue()).getDispSeq())
.compareTo(((ProductType)o2.getValue()).getDispSeq());
}
});
Map sortedMap=new LinkedHashMap();
用于(条目:列表){
sortedMap.put(item.getKey(),item.getValue());
}
返回分拣的DMAP;
}
私有静态映射sortOuterMap(
地图(未分类地图){
列表=新建链接列表(
unsortedMap.entrySet());
集合。排序(列表,
新比较器(){
公共整数比较(条目o1,
入口(氧气){
返回((可比)((ProductType)o1.getValue()
.entrySet().iterator().next().getValue())
.getDispSeq()).compareTo(((ProductType)o2.getValue()
.entrySet().iterator().next().getValue())
.getDispSeq());
}
});
Map sortedMap=new LinkedHashMap();
用于(条目:列表){
sortedMap.put(item.getKey(),item.getValue());
}
返回分拣的DMAP;
}

当你说
o2.get(“dispSeq”)
这是否意味着你的对象的键是
dispSeq
?根据您的示例,您的值对象中是否有一个字段?它们都一样吗?o2.get(“dispSeq”)用于检索用于排序的值(数字)。键是“dispSeq”。有两种方法可以对该地图进行排序。根据ProductType、ChargeType等对象中的dispSeq值对内部映射进行排序,或根据内部映射中的value对象的dispSeq对外部映射进行排序。在后一种情况下,排序将只比较内部映射中第一项的值。您需要哪一个?我认为对外部地图进行排序是最好的解决方案。但我不能用逻辑的方式来思考:S。