2012-04-30 122 views
1

我的問題是關於如何使用自定義對象對其中一個屬性進行排序,但是從自定義條件開始。使用自定義起始點排序ArrayList對象的屬性

讓我解釋一下比較好,這裏是我的代碼:

public static void sortArrayListByProperty(ArrayList colorList){ 

     Collections.sort(colorList, new Comparator(){ 

      public int compare(Object emp1, Object emp2){ 

       int intValue1 = ((ColorCounter)emp1).getIntColorValue();   
       int intValue2 = ((ColorCounter)emp2).getIntColorValue(); 

       if(intValue1 < intValue2) 
        return 1; 
       else if(intValue1 > intValue2) 
        return -1; 
       else 
        return 0;  
      } 
     }); 
    } 

這將我的ArrayList從更大的排序,以更小。

但我想要的是從我將指定的起始號碼排序我的ArrayList。

例如,如果ArrayList包含

5 3 9 1 14 

讓說,我想數字開始從3然後我需要有

3 5 9 14 1 

我希望是足夠多的清晰......

是有可能嗎?

@Joachim紹爾

謝謝,我編輯你的代碼一點點,改變返回值和它的工作!

編輯的代碼:

if (cv1 >= threshold && cv2 < threshold) { 
    return -1; 
} else if (cv2 >= threshold && cv2 < threshold) { 
    return -1; 
} else if (cv1 < cv2) { 
    return 1; 
} else if (cv1 > cv2) { 
    return 1; 
} else { 
    return 0;  
} 

測試例如:

16777215 
16448250 
15790320 
4013373 

排序由15790320:

15790320 
16448250 
16777215 
4013373 
+0

許多解決方案,但我建議你使用簡單的模式,如混合過濾器和排序或混合過濾器和排序和合並? – Luca

+2

爲什麼1會比14大?每個小於3的數字是否會大於3以上的數字?兩個小於3的數字如何比較? – Thomas

+0

如果您在此列表中添加2,8,10,會發生什麼情況?這些輸入之間的邏輯差異是什麼?我認爲你最好將它們添加到期望的位置 – mprabhat

回答

3

你可以試試這個:

public class ColorCounterComparator implements Comparator<ColorCounter> { 
    private final threshold; 

    public ColorCounterComparator(final int threshold) { 
    this.threshold = threshold; 
    } 

    @Override 
    public int compare (ColorCounter c1, ColorCounter c2) { 
    int cv1 = c1.getIntColorValue(); 
    int cv2 = c1.getIntColorValue(); 

    if (cv1 >= threshold && cv2 < threshold) { 
     return -1; 
    } else if (cv2 >= threshold && cv2 < threshold) { 
     return 1; 
    } else if (cv1 < cv2) { 
     return -1; 
    } else if (cv1 > cv2) { 
     return 1; 
    } else { 
     return 0;  
    } 
    } 
} 

這顯然是非常未經測試,可能有一些關閉的情況的一個-ER羅斯,並可能翻轉了-1/1的值。但它應該告訴你基本的想法;-)

+0

是的,你的比較器將有降序。如果'cv1

+0

@GuillaumePolet:謝謝,修正(我希望)。這是一個很好的提醒。但是我會避免直接使用這個構造,因爲它有太多的缺陷(例如,不要試圖用浮點數來使用它,特別是如果它們靠得很近)。 –

0

沒有測試,但你的想法:你有2種情況

  • 這兩個數字都低於開始數字(在您的示例中爲3)或兩者都高於==>比較它們
  • 一個數字低於開始數字,其他以上==>第一個數字在第二個數字之後您的自定義排序順序:

if (intValue1 < start && intValue2 < start || intValue1 >= start && intValue2 >= start) { 
    if(intValue1 < intValue2) 
     return 1; 
    else if(intValue1 > intValue2) 
     return -1; 
    else 
     return 0;  
} else { 
    if (intValue1 < start) 
     return -1; 
    else 
     return 1; 
} 
1

使用ArrayList子列表方法來創建子列表,然後對這個子列表進行排序。

+0

我不認爲這實際上會起作用,因爲想象你有'3 5 1 9 6 7 2 10'這些數字實際上排序的不是連續的。 –

+0

@GuillaumePolet我不明白爲什麼這不應該工作?使用subList-method可以簡單地將原始列表的範圍視爲視圖。您可以對該範圍進行排序 - 無論該範圍內的數字是否連續。 –

+0

@FabianBarney根據我的理解,在我的例子中,並且說只有值等於或大於3應該排序,你應該有'3 5 9 6 7 10 1 2'。現在,如果你想對這樣的列表進行排序,你會使用哪些子列表索引? –

相關問題