2013-04-02 82 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