使用具有不同不同条件的比较器</hashmap>对ArrayList <hashmap>进行排序

时间:2012-11-14 07:13:57

标签: android arraylist sorting comparator

我有一个ArrayList,我在其中存储 CustomerName,Type,Distance,State等值,并使用此ArrayList显示ListView。 我创建了一个comaprator,我根据下面的类型对Customer进行排序。

Type1 - Gold
Type2 - Silver
Type3 - Other

我已成功完成排序,但还有一件事需要补充,我将通过以下示例进行解释。

说明: -

在我的应用中,我们有高级用户作为Gold&amp;类型银即可。其他类型的用户是非高级用户。当用户从我的应用程序进行搜索时,我有Web服务来获取数据。它基于州,城市和Readius(即距离像25英里/ 50英里等)

例如,您搜索了 New Jersy(州/省),Mahwah(City)&amp;半径为25英里,因此它将根据这些标准为您提供可用结果列表。现在发生的事情是,在此搜索中,还包括一些out状态结果,因为它满足 Radius Criteria 。就像我搜索这个一样,我也得到纽约(州/省)的结果。这里出现了问题,因为在纽约州,我有一些Gold类型的用户,因此NewYork州的CustomerName将成为NewJersy Silver类型用户的首选。

来自Web服务电话的结果=

CustomerName - ABCD
Type - Silver
State - New Jersy
Distance - 1mile

CustomerName - DEF
Type - Gold
State - New York
Distance - 20mile

CustomerName - XYZ
Type - Gold
State - New York
Distance - 22mile

CustomerName - PQR
Type - Other
State - New Jersy
Distance - 5mile

使用我的比较器排序Rsult =

CustomerName - DEF
Type - Gold
State - New York
Distance - 20mile

CustomerName - XYZ
Type - Gold
State - New York
Distance - 22mile

CustomerName - ABCD
Type - Silver
State - New Jersy
Distance - 1mile

CustomerName - PQR
Type - Other
State - New Jersy
Distance - 5mile

我想要的结果是什么=

CustomerName - ABCD
Type - Silver
State - New Jersy
Distance - 1mile

CustomerName - DEF
Type - Gold
State - New York
Distance - 20mile

CustomerName - XYZ
Type - Gold
State - New York
Distance - 22mile

CustomerName - PQR
Type - Other
State - New Jersy
Distance - 5mile

我的标准是 - &gt;我想在列表顶部显示用户搜索的高级用户列表(即,如果您搜索新的Jersy,而不是显示该状态/设备的所有高级用户),以及是否为OUT状态(即,如果为新约克州的数据来自给定半径的高级用户和其他的底部其余部分(无论是哪种状态数据)用户类型。

比较者 -

public class VendorTypeComparator implements Comparator<HashMap<String, String>>{
    List<String> preDefinedOrder;

    public VendorTypeComparator(String[] order) {
        // TODO Auto-generated constructor stub
        // order is {"Gold", "Silver", "Other"}
        this.preDefinedOrder = Arrays.asList(order);
    }


    @Override
    public int compare(HashMap<String, String> o1, HashMap<String, String> o2) {
        // TODO Auto-generated method stub
        return preDefinedOrder.indexOf(o1.get("VendorType").toString()) - preDefinedOrder.indexOf(o2.get("VendorType").toString());
    }
}

请提供解决此问题的建议。

由于

1 个答案:

答案 0 :(得分:1)

一个可能的技巧是基于秩函数建立度量。它允许您使用仅比较您的比较器,而无需任何拆分/合并

设计一个将单个搜索结果映射为数字的函数。

  • 说,给目标状态下的任何一个黄金,1000万到1000万 那里有任何银子,其他州或其他任何地方的金币都是8 逻辑。 ABCD将获得10M级别; DEF和XYZ - 每个9M。

  • 然后减去距离。 ABCD将获得10M-1; DEF 9M-20和XYZ - 9M-22。等等。

  • 这会将您的结果拆分为可比组,并在其中建立更精细的订单 那些。

让比较器比较o1和o2上的呼叫结果。如果为零,则按字典顺序比较其他内容,例如名称。就是这样。