【问题标题】:Sorting ArrayList of HashMap based on key value基于键值对HashMap的ArrayList进行排序
【发布时间】:2012-11-25 07:13:59
【问题描述】:

我有一个 HashMap 列表。每个 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 字段对数组列表进行排序。

【问题讨论】:

  • “我有很多这样的项目”。您应该将其存储在 SQLite 中。
  • 我不需要那个。假设列表有 25 个这样的项目详细信息。数据会不断变化,而且是暂时的。它不会占用太多内存。

标签: java hashmap


【解决方案1】:

我建议您使用自定义产品类来为您执行此操作。恕我直言,它最终将使您的代码更易于维护和更健壮。

这个怎么样?

代表数据的类:

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

【讨论】:

  • 谢谢。我也试试这个
  • 这是一个好方法。由于 Java 应该是 OOP,因此实体类将支持字符串列表
【解决方案2】:

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

【讨论】:

  • 我会试试然后回来
【解决方案3】:

简而言之,您可以使用 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; }
});

【讨论】:

  • 我不明白答案。我不仅有两组数据。我的数组列表中有 25 组哈希图。
  • 首先使用 toArray() 将 ArrayList 转换为数组。然后它使用 Arrays 类中的内置排序。 Arrays.sort() 运行合并排序,通过调用您传入的比较器来比较每对元素。所以基本上,如果 o1 在 o2 之前,您的比较器只需要返回 -1,如果它们相同则返回 0,以及 1如果 o1 在 o2 之后。 Arrays.sort() 会处理剩下的事情。
  • 此代码不起作用。 1) Arrays 方法进行就地排序,您不能通过调用它来分配值。 2) 原始集合不受您调用的影响,因为您不是对其进行排序,而是对其进行排序。
  • 为什么要转换成数组,Collection.sort` 也一样。
猜你喜欢
  • 2015-04-22
  • 2017-09-17
  • 2016-08-15
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多