按一个字段</hashmap <string,string>对ArrayList <hashmap <string,string>进行排序

时间:2015-01-10 16:55:17

标签: java android sorting arraylist

在Android应用程序中,我调用Web服务,获取json响应并将其放入Hashmap的ArrayList中(JSON中返回的每个标识符都有一个字段。

我存储[n]项目的列表定义为:

private ArrayList<HashMap<String, String>> customerDataList;

当我收到数据时,我创建了一个新的Hashmap集合,如下所示:

HashMap<String, String> customer = new HashMap<>();

然后我只需添加我需要的值,例如

JSONObject thisCustomer = customerArr.getJSONObject(customerIndex);

String customerName = thisCustomer.getString(TAG_CUSTOMER_NAME);
customer.put(TAG_CUSTOMER_NAME, customerName);

double location = // get location based on GPS
customer.put(TAG_LOCATION, location);    

// snip...

然后,当我填充该客户对象后,我将其添加到列表中:

customerDataList.add(customer);

现在,我想按一个值(我在上面设置的位置)对这些数据进行排序。

目前,在我填充了customerDataList后,我遍历它,构建一个包含所有位置的数组,对其进行排序,然后循环遍历排序的数组。在其中,我循环遍历customerDataList并将外部位置(已排序的值)与内部进行比较,并构建另一个已排序的customerDataList。

有没有办法可以排序而不需要3个循环?

编辑:Mike让您的解决方案适用于双打吗?

未分类的位置如下

1513.70
702.59
814.59
604.99

然而,我打电话给你的班级后的最终名单是

1513.70
604.99
702.59
814.59

1 个答案:

答案 0 :(得分:4)

如果我正确理解了这个问题,听起来你可以使用自定义比较器来排序数组列表:

public class LocationComparator 
             implements Comparator<HashMap<String, String>> 
{
   @Override
   public int compare(HashMap<String, String> o1, 
                      HashMap<String, String> o2) 
   {
       return Double.compare(o1.get(TAG_LOCATION), o2.get(TAG_LOCATION));
   }
}

Collections.sort(customerDataList, new LocationComparator());

当然,您可以使用匿名类来内联实现Comparator<>接口。

但是,除此之外,为什么要将客户实体存储在哈希映射中?这似乎很浪费..