我试图排序:
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;
}
});
}
但是,由于我丢失了主地图的密钥,因此无法正常工作。
有什么想法吗?
答案 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
的值,并相应地返回值。