4

我有一个 HashMaps 列表。每个 HashMap 由几个 kay-value 对组成,所有内容都以字符串形式出现。我将所有哈希图存储在一个数组列表中。现在我需要根据哈希图中的键对数组列表进行排序。

这是我的示例数据:

{
 "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 字段对数组列表进行排序。

4

3 回答 3

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;

现在定义一个比较器进行排序,每个字段对应一个您需要排序的字段。这是 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(products, new ProductProductIdComparator());
于 2012-11-25T07:48:46.497 回答
6

Collections类提供了一种实用方法,用于使用 Comparator对列表进行就地排序。

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
    }
}
于 2012-11-25T07:37:55.707 回答
-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; }
});
于 2012-11-25T07:28:58.847 回答