2010-03-10 4 views
4

다음은 내가 가지고있는 것입니다.hashMap 값 [not keys]을 기반으로하는 HashMaps 목록

어떻게 여러 키와 그 값을 비교할 수 있습니까? 지금 내가 대신 HashMaps을의 목록을 사용하여 데이터를 저장하는 클래스를 만들 것이다

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) ; 
      } 
     } 
    } 


} 

답변

1

을 가장 쉽게는 commons-lang에서 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(); 
} 

또는 무언가를. 어쨌든 Daniil의 제안에 따라 비교기에서 Genrics를 사용하는 것이 좋습니다.

+0

정렬 조건이 변경되면 매번 새로운 Comparator 클래스를 정의해야합니까? – jagamot

3

먼저 ... 난 단지 employeeId를 사용하고 있지만 정렬 내 비교 departmentId 등을 포함하고 싶었다. 그런 다음 해당 클래스가 Comparable 인터페이스를 구현하도록하여 세분화 된 비교 알고리즘을 결정할 수있게합니다.

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; 
    } 
} 

이 코드가 컴파일되거나 올바른 결과를 반환한다는 보장은 없습니다. 나는 CompareToBuilder를 정말 좋아한다.

+0

두 번째 방법에 대한 코드 스 니펫 (snippet)은 무엇입니까? 필자의 경우 목록 을 사용하는 것은 필연적입니다. 어떤 사람이 위의 예를 업데이트 할 수 있다면 도움이 될 것입니다. – jagamot

+0

저는 제네릭 사용에 대한 경험이 전혀없는 구식 자바 개발자입니다. 그러나 제네릭 코드가 아닌 제 답변에 예제를 넣을 것이고 사용을 위해이 코드를 적용 할 수 있습니다. – martinatime

+0

martinatime >> 예를 연구 할 기회가 있었습니까? – jagamot

0

martinatime의 대답은 정확하다. 데이터를 저장할 클래스를 만듭니다.

new TreeMap<Integer, YouNewClass>(new Comparator<YourNewClass>() { 

public int compare(YourNewClass o1, YourNewClass o2) { 
     implement the method here as per your logic. 
} 

}); 

이 즐길 수 : 그럼 당신은 트리 맵으로, 키 정렬을 지원하는지도에 넣어 http://java.sun.com/j2se/1.4.2/docs/api/java/util/TreeMap.html

+0

사람들이 제네릭에 사로 잡히게 된 이유는 확실하지 않습니다. 특히이 경우 코드를 읽기 쉽게 만듭니다. 제네릭이 없다면 정확히 똑같이하기 위해 캐스팅을하십시오. 귀하의 최종 솔루션을 알려주십시오. 건배! – Daniil