java 根据 hashMap 值对 HashMap 列表进行排序 [不是键]
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2420311/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Sort List of HashMaps based on hashMap values [not keys]
提问by jagamot
Here is what I have-
这是我所拥有的-
How I can include multiple keys and their values in comparison? Right now I am only using employeeId but I wanted to include departmentId and other in my comparison for sorting...
如何在比较中包含多个键及其值?现在我只使用employeeId,但我想在我的比较中包含departmentId和other以进行排序......
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
public class Tester {
boolean flag = false ;
public static void main(String args[]) {
Tester tester = new Tester() ;
tester.printValues() ;
}
public void printValues ()
{
List<HashMap<String,Object>> list = new ArrayList<HashMap<String,Object>>() ;
HashMap<String,Object> map = new HashMap<String,Object>();
map = new HashMap<String,Object>();
map.put("employeeId", new Integer(1234)) ;
map.put("departmentId", new Integer(110)) ;
map.put("someFlag", "B") ;
map.put("eventTypeId", new Integer(11)) ;
map.put("startDate", new Date() ) ;
map.put("endDate", new Date() ) ;
list.add(map);
map = new HashMap<String,Object>();
map.put("employeeId", new Integer(456)) ;
map.put("departmentId", new Integer(100)) ;
map.put("someFlag", "B") ;
map.put("eventTypeId", new Integer(11)) ;
map.put("startDate", new Date() ) ;
map.put("endDate", new Date() ) ;
list.add(map);
map = new HashMap<String,Object>();
map.put("employeeId", new Integer(1234)) ;
map.put("departmentId", new Integer(10)) ;
map.put("someFlag", "B") ;
map.put("eventTypeId", new Integer(17)) ;
map.put("startDate", new Date() ) ;
map.put("endDate", new Date() ) ;
list.add(map);
map = new HashMap<String,Object>();
map.put("employeeId", new Integer(1234)) ;
map.put("departmentId", new Integer(99)) ;
map.put("someFlag", "B") ;
map.put("eventTypeId", new Integer(11)) ;
map.put("startDate", new Date() ) ;
map.put("endDate", new Date() ) ;
list.add(map);
map = new HashMap<String,Object>();
map.put("employeeId", new Integer(1234)) ;
map.put("departmentId", new Integer(100)) ;
map.put("someFlag", "B") ;
map.put("eventTypeId", new Integer(11)) ;
map.put("startDate", new Date() ) ;
map.put("endDate", new Date() ) ;
list.add(map);
map = new HashMap<String,Object>();
map.put("employeeId", new Integer(567)) ;
map.put("departmentId", new Integer(200)) ;
map.put("someFlag", "P") ;
map.put("eventTypeId", new Integer(12)) ;
map.put("startDate", new Date() ) ;
map.put("endDate", new Date() ) ;
list.add(map);
Collections.sort ( list , new HashMapComparator2 () ) ;
for( int i = 0 ; i < list.size() ; i ++ ) {
System.out.println(list.get(i));
}
System.out.println("======================================");
flag = true ; // desc
Collections.sort ( list , new HashMapComparator2 () ) ;
for( int i = 0 ; i < list.size() ; i ++ ) {
System.out.println(list.get(i));
}
}
public class HashMapComparator2 implements Comparator
{
public int compare ( Object object1 , Object object2 )
{
if ( flag == false )
{
Integer obj1Value = ( Integer ) ( ( HashMap ) object1 ).get ( "employeeId" ) ;
Integer obj2Value = ( Integer ) ( ( HashMap ) object2 ).get ( "employeeId" ) ;
return obj1Value.compareTo ( obj2Value ) ;
}
else
{
Integer obj1Value = ( Integer ) ( ( HashMap ) object1 ).get ( "employeeId" ) ;
Integer obj2Value = ( Integer ) ( ( HashMap ) object2 ).get ( "employeeId" ) ;
return obj2Value.compareTo ( obj1Value ) ;
}
}
}
}
采纳答案by Andre Rodrigues
The easiest is using the CompareToBuilderfrom commons-lang. Your example would look like this:
最简单的就是使用CompareToBuilder从公共浪。您的示例如下所示:
Map<String, Object> map1 = (Map<String, Object>) object1;
Map<String, Object> map2 = (Map<String, Object>) object2;
if ( flag == false ) {
return new CompareToBuilder()
.append(map1.get("employeeId"), map2.get("employeeId"))
.append(map1.get("departmentId"), map2.get("departmentId"))
.toComparison();
}
else {
return new CompareToBuilder()
.append(map2.get("employeeId"), map1.get("employeeId"))
.append(map2.get("departmentId"), map1.get("departmentId"))
.toComparison();
}
Or something like that. Anyway, I would definitely recommend that you use Genrics in your comparators, as suggested by Daniil.
或类似的东西。无论如何,我绝对建议您按照 Daniil 的建议在比较器中使用 Genrics。
回答by martinatime
First I would create a Class to store the data instead of using a List of HashMaps. Then make that class implement the Comparable interface which allows you determine a finely-grained comparison algorithm.
首先,我将创建一个类来存储数据,而不是使用 HashMap 列表。然后使该类实现 Comparable 接口,该接口允许您确定细粒度的比较算法。
If you absolutely need to use a HashMap then I would create a class that extends HashMap AND implements Comparable. But I don't recommend that approach.
如果您绝对需要使用 HashMap,那么我将创建一个扩展 HashMap 并实现 Comparable 的类。但我不推荐这种方法。
public class Foo extends HashMap implements Comparable {
private boolean ascending = true;
public int compareTo(Object bar) {
int result;
if (bar == null || !(bar instanceof Foo)) {
result = -1;
}
Foo _rhs = (Foo)bar;
result = new CompareToBuilder().append(get("employeeId"),_rhs.get("employeeId"))
.append(get("departmentId"),_rhs.get("departmentId")).toComparison();
return (ascending ? result : -result);
}
public void setAscending(boolean asc) {
ascending = asc;
}
}
No guarantees that this code will compile or return correct results. I really like the CompareToBuilder
不保证此代码将编译或返回正确的结果。我真的很喜欢 CompareToBuilder
回答by Daniil
martinatime's answer is correct. Create a class to store your data. Then you put it into map that supports key sorting, such as TreeMap:
马丁纳时间的答案是正确的。创建一个类来存储您的数据。然后你把它放到支持key排序的map中,比如TreeMap:
new TreeMap<Integer, YouNewClass>(new Comparator<YourNewClass>() {
public int compare(YourNewClass o1, YourNewClass o2) {
implement the method here as per your logic.
}
});
Enjoy: http://java.sun.com/j2se/1.4.2/docs/api/java/util/TreeMap.html
享受:http: //java.sun.com/j2se/1.4.2/docs/api/java/util/TreeMap.html

