3

CustomerName、Type、Distance、Stateなどの値を格納しているArrayListが1つあり、このArrayListを使用してListViewを表示しています。 以下のように、タイプに基づいて顧客をソートする1​​つのコマプラーを作成しました。

Type1 - Gold
Type2 - Silver
Type3 - Other

並べ替えは正常に完了しましたが、追加する必要があることがもう1つあります。これは、以下の例で説明しています。

説明 :-

私のアプリでは、ゴールド&シルバーのタイプとしてプレミアムユーザーがいます。他のタイプのユーザーは非プレミアムユーザーです。ユーザーがアプリから検索を行ったときにデータを取得するためのWebサービスがあります。州、市、およびReadiusに基づいています(つまり、25マイル/ 50マイルなどの距離) 。

たとえば、ニュージャージー(州/県)、マフア(市)、半径を25マイルで検索した場合、これらの基準に基づいて利用可能な結果のリストが表示されます。ここで何が起こるかというと、この検索で​​は、半径基準を満たすため、状態外の結果の一部も含まれています。これを検索すると、ニューヨーク(州/県)の結果も表示されます。ここで問題が発生するのは、ニューヨーク州にゴールドタイプのユーザーがいるため、NewYork州のCustomerNameがNewJersyシルバータイプのユーザーの先頭に移動するためです。

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

私の基準は->プレミアムユーザーのリストを、ユーザーが検索するリストの一番上に表示したい(つまり、ニュージャージーを検索した場合、その州/県のすべてのプレミアムユーザーを一番上に表示するよりも)、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

考えられるトリックの 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 に答える