2013-04-02 84 views
0

我有一个含有两种元素 - 免费项目和付费项目的列表。如何将具有两组元素的列表排序为两个按字母顺序排列的列表

我想排序清单,使付费项目将在列表的第一部分和免费项目在列表的第二部分。

我有一套比较器,如A-Z排序,Z-A排序,Type排序。

无论是什么类型的排序,它应该总是显示列表的第一部分中的最终列表作为付费项目,并且列表的第二部分中的免费项目以及基于比较器排序的列表中的每个集合Az或ZA等)。

敌人例如。

我有三个付费项目和五个免费项目。
当我在A-Z上对完整列表进行排序时,它应该在A-Z排序中显示三个付费项目,然后按A-Z排序顺序显示免费项目。

我想知道如何实现这一点。


更新的代码片段:

列表包含名称{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}。

回答

1

一种方法在任何地方是这样的:

像这样修改你的每个比较器:

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

//算法

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

如果T1支付和T2是免费退货1 否则,如果T1是免费的,T2被其他支付返回-1 //都是免费或付费的,然后根据AZ起始字符 进行比较返回(比较开始字符)。

所以,如果你有以Z开头的付费项目,那么这将是付费项目开始A.

修改后:

Collections.sort(myList中,新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; 
    } 
+0

能否请你阐述我的代码片段,我应该怎么修改比较。 – Sen

1

您可以尝试using a second parameter als Comperator

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

使用该comperator,您可以对列表进行排序。

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

There is a nice and easy example of this here.

例如,你有类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);

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 
    } 
    
+0

这是一个好主意,但我不想通过创建两个列表然后排序然后合并它们来创建开销。我正在寻找像Shreyas说的http://stackoverflow.com/a/15760975/449378。 – Sen