0

無料アイテムと有料アイテムの 2 種類の要素を含むリストがあります。

有料アイテムがリストの最初の部分に、無料アイテムがリストの 2 番目の部分になるようにリストを並べ替えたいと思います。

AZソート、ZAソート、タイプソートなどの一連のコンパレータがあります。

並べ替えの種類が何であれ、最終的なリストは常にリストの最初の部分に有料アイテムとして表示され、リストの 2 番目の部分に無料アイテムとして表示され、コンパレータ (Az または ZA. 。等)。

敵例えば。

3 つの有料アイテムと 5 つの無料アイテムがあります。
リスト全体を AZ で並べ替えると、3 つの有料アイテムが AZ ソートで表示され、次に無料アイテムが AZ ソートで表示されます。

これを実装する方法を知りたいです。


コード スニペットで更新します。

リストには、{APaid、MFree、OFree、BPaid、NFree、PFree、CPaid、QFree} という名前のアイテムが含まれています。

Collections.sort(myList, new UtilityClass.TitleComparatorAtoZ());  

public static class TitleComparatorAtoZ implements Comparator
    {

        public int compare(Object o1, Object o2)
        {
            int result = 0;

            if ((o1 != null) && (o2 != null))
            {
                if (o1 instanceof Item && o2 instanceof Item)
                {
                    Item lmi1 = (Item) o1;
                    Item lmi2 = (Item) o2;

                    if ((lmi1.getName() != null) && (lmi2.getName() != null))
                    {
                        result = lmi1.getName().compareToIgnoreCase(lmi2.getName());
                    }
                }
            }
            return result;
        }
    }

最終的なリストは {APaid, BPaid, CPaid, MFree, NFree, OFree, PFree, QFree}..

4

3 に答える 3

1

私が考えることができる1つの方法はこれです:

次のように各コンパレータを変更します。

まず、2 つのオブジェクト パラメータを有料か無料かで比較し、次に AZ などで比較します。

//アルゴリズム

コンパレータ(オブジェクト T1、オブジェクト T2) 開始

T1 が支払われ、T2 が無料の場合は 1 を返します。そうでない場合は、T1 が無料で T2 が支払われている場合は return -1 です。

したがって、Z で始まる有料アイテムがある場合は、A で始まる有料アイテムの後になります。

変更:

Collections.sort(myList, new UtilityClass.TitleComparatorAtoZ());

public static class TitleComparatorAtoZ は Comparator を実装します {

    public int compare(Object o1, Object o2)
    {
        int result = 0;

        if ((o1 != null) && (o2 != null))
        {
            if (o1 instanceof Item && o2 instanceof Item)
            {
                Item lmi1 = (Item) o1;
                Item lmi2 = (Item) o2;

                if ((lmi1.getName() != null) && (lmi2.getName() != null))
                {
                    if(lmi1.getName().endsWith("Paid") 
                       && lmi2.getName().endsWith("Free")) 
                    {
                         result = 1;
                    }
                    else if (lmi1.getName().endsWith("Free") 
                       && lmi2.getName().endsWith("Paid"))
                    {
                         result = -1;
                    }
                    else
                    {
                         result = lmi1.getName().compareToIgnoreCase(lmi2.getName());

                    }

                                        }
            }
        }
        return result;
    }
于 2013-04-02T09:46:35.143 に答える
0
  1. 無料アイテムと有料アイテムのリストを 2 つの別々のリストに分類する

    for ( X x : list ) {
        if ( isFreeItem ) {
            add to freeItemList
        } else {
            add to paidItemList
        }
    }
    
  2. コンパレータ クラスを使用して、各リストを個別に並べ替えます

    Collections.sort(freeItemsList);
    Collections.sort(paidItemsList);
    
  3. 新しいリストをインスタンス化し、それに応じてpaidItemsListとfreeItemsListを配置します

    List result = new ArrayList();
    for ( X x : paidItemsList ) {
        add to result
    }
    
    for ( X x : freeItemsList ) {
        add to result
    }
    
于 2013-04-02T09:51:11.310 に答える