2011-10-20 93 views
0

的向量我有哈希映射的向量和HashMap中包含不同的數據類型:如何排序包含HashMap

Vector<HashMap<String, Object>> theVector= new Vector<HashMap<String, Object>>(); 

theResults包含此HashMap:

HashMap<String, Object> theHashMap= new HashMap<String, Object>(); 

theHashMap具有以下數據: (假設這是一個for循環)

//1st set 

theHashMap.put("BLDG_ID", 111); //int 
theHashMap.put("EMP_NAME", "AAA"); //String 
theHashMap.put("FLAG", true); //boolean 

theVector.add(theHashMap); 

//2nd set 

theHashMap.put("BLDG_ID", 222); //int 
theHashMap.put("EMP_NAME", "BBB"); //String 
theHashMap.put("FLAG", false); //boolean 

theVector.add(theHashMap); 

//2nd set<br> 
theHashMap.put("BLDG_ID", 111); //int 
theHashMap.put("EMP_NAME", "CCC"); //String 
theHashMap.put("FLAG", false); //boolean 

theVector.add(theHashMap); 

我想排序我的向量的內容HashMap中根據BLDG_ID這樣,當我顯示的數據會看起來像

BLDG_ID || EMP_NAME 
111  || AAA 
111  || CCC 
222  || BBB 

我該怎麼辦呢?

+0

我>和<在這裏已經剝離是爲theVector聲明再次' 矢量< HashMapvString,對象> > theVector =新的向量<的HashMap <字符串,對象> >(); –

+0

請了解如何使用Markdown:http://stackoverflow.com/editing-help – NullUserException

+0

argh。我的< and >已被剝離,這裏是向量的聲明再次'' Vector > theVector = new Vector >(); HashMap theHashMap = new HashMap (); –

回答

1

實現自定義Comparator<Map<String, Object>>,然後的調用Collections.sort

注意:您可能需要使用ArrayList,而不是矢量。

+0

嗨puce,即時通訊不知道我明白你是什麼意思的自定義比較器..你會介意給一個例子嗎? –

+0

看看Bhesh Gurung的回答。他給了這樣一個比較器的樣本。 – Puce

2

我認爲你做這樣的事情會好得多:不要爲你的值使用散列表,只要創建一個類。然後,您的業務將得到compile time checking,這將有助於防止錯誤發生。

class Employee implements Comparable<Employee> { 
    int buildingId; 
    String name; 
    boolean flag; 

    Employee(int b, String n, boolean f) { 
     buildingId = b; 
     name = n; 
     flag = f; 
    } 

    public int compareTo(Employee other) { 
     if(other.buildingId == this.buildingId) 
      return name.compareTo(other.name); 
     return buildingId - other.buildingId; // potential for overflow, be careful 
    } 

} 

然後,你可以使用任何你想要的排序矢量。如果您使用ArrayList(Vector的現代形式),你可以使用Collections.sort(myList);

List<Employee> emps = new ArrayList<Employee>(); 
emps.add(new Employee(111,"AAA",true)); 
emps.add(new Employee(111,"CCC",false)); 
emps.add(new Employee(111,"BBB",false)); 

Collections.sort(emps); 
System.out.println("Building Id,Employee Name"); 
for(Employee emp : emps) System.out.println(emp.getCSV()); // or however you want to format it 
+0

+1:[object denial]的另一種情況(http://stackoverflow.com/questions/3725703/how-to-store-more-than-one-string-in-a-map)。 –

+0

不幸的是,我不能改變哈希映射,因爲一些其他進程需要對象 –

+0

@Joachim這是一個術語的寶石! – corsiKa

1
List<Map<String, Object>> vector = new Vector<Map<String, Object>>(); 

Collections.sort(vector, new Comparator<Map<String, Object>>() { 
    @Override 
    public int compare(Map<String, Object> map1, Map<String, Object> map2) { 
     return ((Integer) map1.get("BLDG_ID")).compareTo((Integer) map2.get("BLDG_ID"))); 
    }    
}); 

更新:爲您的代碼:

「最後」

theVector.add(theHashMap); 

後添加以下

Collections.sort(theVector, new Comparator<HashMap<String, Object>>() { 
     @Override 
     public int compare(HashMap<String, Object> o1, HashMap<String, Object> o2) { 
      return ((Integer) o1.get("BLDG_ID")).compareTo((Integer) o2.get("BLDG_ID")); 
     }    
    }); 
+0

使用接口(Map)而不是實現(HashMap)。除此之外,我認爲第二個通用參數應該是Object。 – Puce

+0

@Puce:改變它。感謝您的建議。 –

+0

感謝Bhesh Gurung&puce, 請原諒我的無知,但我如何使用上面的代碼給出我的數據樣本?我在同樣的方法裏添加了自定義比較器,我有theVector.add(theHashMap);和HashMap.put(「BLDG_ID」,222); // int
等? 感謝您的耐心等待 –