3

我有一个 ArrayList,我在其中存储诸如CustomerName、Type、Distance、State 之类的值,并使用这个 ArrayList 来显示 ListView。 我创建了一个 comaprator,我在其中根据客户的类型对客户进行排序,如下所示。

Type1 - Gold
Type2 - Silver
Type3 - Other

我已成功完成排序,但我还必须添加一件事,我将用下面的示例进行解释。

解释 :-

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

例如,您搜索New Jersy(State/Province)、Mahwah(City) & Radius 为 25miles,因此它将根据这些条件为您提供可用结果列表。现在发生的情况是,在此搜索中,还包括了一些外状态结果,因为它们满足Radius Criteria。就像我搜索这个一样,我也会得到New York(State/Province)的结果。问题出现在这里是因为在纽约州我有一些黄金类型的用户,因此纽约州的 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

使用 My Comparator 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

我的标准是 -> 我想在用户搜索的列表顶部显示高级用户列表(即,如果您搜索新泽西州而不是在顶部显示该州/省的所有高级用户),而不是 OUT STATE(即如果纽约州数据来自给定半径)高级用户和其他(无论它是哪个州数据)类型的用户的底部其余部分。

比较器 -

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

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

谢谢

4

1 回答 1

1

一个可能的技巧是建立一个基于排名函数的度量。它将允许您仅使用比较器,而无需任何 split/merge

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

  • 比如说,给目标州的任何金币 1000 万,给那里的任何银币 900 万,给其他州的金币 8 或任何你的逻辑。ABCD将获得10M排名;DEF 和 XYZ - 各 9M。

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

  • 这会将您的结果分成可比较的组,并在这些组中建立更精细的顺序。

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

于 2012-11-14T08:08:23.127 回答