2012-11-25 103 views
4

我有一個HashMap的列表。每個HashMap由多個kay-value對組成,所有內容都以字符串的形式出現。我將所有hashmaps存儲在arraylist中。現在我需要根據hashmap中的鍵對排列列表進行排序。基於鍵值對HashMap的ArrayList進行排序

這裏是我的樣本數據:

{ 
"productID":"5643", 
"productName":"Apple - iPod touch", 
"outsidePrice":"189.99", 
"merchantID":"134439", 
"ourPrice":"184.99", 
"storeName":"Ebay", 
} 


{ 
"productID":"3243", 
"productName":"Apple - iPad", 
"outsidePrice":"389.99", 
"merchantID":"54439", 
"ourPrice":"384.99", 
"storeName":"Apple", 
} 

我存儲這個結構裏面這個數據。

ArrayList<HashMap<String, String>> data_list = new ArrayList<HashMap<String, String>>(); 

我有這樣的物品的巨大清單。現在我需要根據hashmap中的productName,Price,storeName,productID字段對arraylist進行排序。

+0

「我有一個巨大的像這樣的產品清單」。你應該將它存儲在SQLite中。 – Simon

+0

我不需要那個。說這個清單有25個這樣的物品細節。數據將保持變化,並且是暫時的。它不會佔用太多的記憶。 – intrepidkarthi

回答

5

Collections類使用比較器提供了一種用於對列表進行排序的實用方法。

final List<Map<String, String>> dataList = new ArrayList<HashMap<String, String>>(4); 
Collections.sort(dataList, new Comparator<Map<String, String>>() { 
    @Override 
    public int compare(final Map<String, String> map1, final Map<String, String> map2) { 
     // Get fields from maps, compare 
    } 
} 
+0

我會嘗試並回來 – intrepidkarthi

-1

你可以使用arrays.sort()來實現這一點,簡而言之,在一些小的內存成本。

HashMap[] result = Arrays.sort(list.toArray(), new Comparator() { 
    public void compare(Object o1, Object o2) { 
    HashMap<String, String> a = (HashMap<String, String>)o1; 
    HashMap<String, String> b = (HashMap<String, String>)o2; 
    // return value as per contract of Comparator.compare() doing whatever comparisons you need. 
    } 

    public boolean equals(Object obj) { return this == obj; } 
}); 
+0

我不明白答案。我沒有兩組數據。我的數組列表裏有25組hashmap。 – intrepidkarthi

+0

這樣做首先將ArrayList轉換爲帶有toArray()的數組。然後它使用Arrays類中的內置排序。 Arrays.sort()運行合併排序,通過調用傳入的比較器比較每對元素。因此,基本上,如果o1在o2之前,則比較器只需返回-1,如果它們相同,則爲0如果o1在o2之後。 Arrays.sort()將處理其餘的事情。 – Sajid

+0

此代碼不起作用。 1)數組方法進行排序,你不能指定一個值來調用它。 2)原始集合不受您的調用影響,因爲您沒有對它進行排序,而是從中創建了一個數組。 – Perception

7

我建議您使用自定義產品類來爲您做到這一點。它最終將使您的代碼更易於維護並更加健壯,恕我直言。

這個怎麼樣?

一個類來表示你的數據:

class Product{ 

    public string productId; 
    public string productName; 
    public BigDecimal outsidePrice; 
    public int merchantId; 
    public BigDecimal ourPrice; 
    public string storeName; 

// whatever constuctors you need 

} 

列表您的產品:

List<Product> products; 

現在定義一個Comparator排序,每一個你需要進行排序字段。這是productId的一個例子。

public class ProductProductIdComparator implements Comparator<Product>{ 

    @Override 
    public int compare(Product product1, Product product2) { 

     if (product1.productId > product2.productId){ 
      return +1; 
     }else if (product1.productId < product2.productId){ 
      return -1; 
     }else{ 
      return 0; 
     } 
    } 
} 

最後,它接受一個比較作爲參數Collections sort

Collections.sort(products, new ProductProductIdComparator()); 
+0

謝謝。我也會試試這個 – intrepidkarthi

+0

這是一個很好的方法。由於Java應該是OOP,因此實體類需要支持字符串列表 – ErikFWinter

相關問題