我有一个HashMaps列表。每个HashMap由几个kay-value对组成,一切都以字符串形式出现。我将所有的hashmaps存储在arraylist中。现在我需要根据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 :(得分: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());
答案 1 :(得分: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
}
}
答案 2 :(得分:-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; }
});