0

我有一个包含两种元素的列表 - 免费项目和付费项目。

我想对列表进行排序,使付费项目位于列表的第一部分,免费项目位于列表的第二部分。

我有一组比较器,如 AZ 排序、ZA 排序、类型排序。

无论是哪种排序类型,它都应始终将最终列表显示为列表第一部分中的付费项目和列表第二部分中的免费项目,并且列表中的每个集合都根据比较器(Az 或 ZA. 。ETC)。

敌人例如。

我有三个付费项目和五个免费项目。
当我对 AZ 上的完整列表进行排序时,它应该按 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

您可以尝试使用第二个参数 als Comperator

它允许您传递 Comparator 的实例以根据您的需要进行排序。例如,您可以创建一个比较器来检查Name所有对象的变量,或者创建一个比较器来检查变量Type

使用该比较器,您可以对列表进行排序。

public static <T> void sort(List<T> list,
                            Comparator<? super T> c)

这里有一个很好且简单的例子。

例如,你有类Fruit。您可以将以下代码放在此类中:

public static Comparator<Fruit> FruitNameComparator 
                      = new Comparator<Fruit>() {

    public int compare(Fruit fruit1, Fruit fruit2) {

      String fruitName1 = fruit1.getFruitName().toUpperCase();
      String fruitName2 = fruit2.getFruitName().toUpperCase();

      //ascending order
      return fruitName1.compareTo(fruitName2);

      //descending order
      //return fruitName2.compareTo(fruitName1);
    }

};

使用该代码,您可以在任何地方比较水果的名称 Arrays.sort(fruits, Fruit.FruitNameComparator);

于 2013-04-02T09:38:06.150 回答
1

我能想到的一种方法是:

像这样修改每个比较器:

首先根据是付费项目还是免费项目比较两个对象参数,然后根据 AZ 等进行比较...

//算法

比较器(对象 T1,对象 T2)开始

如果 T1 付费并且 T2 是免费的,则返回 1 否则如果 T1 是免费的并且 T2 是付费的 return -1 else //两者都是免费的或付费的,然后根据 AZ 起始字符返回比较(比较起始字符)。

因此,如果您有一个以 Z 开头的付费项目,那么它将在以 A 开头的付费项目之后。

修改的:

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

公共静态类 TitleComparatorAtoZ 实现比较器 {

    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 回答