使用自定义起点对ArrayList Objects属性进行排序

时间:2012-04-30 13:07:23

标签: java sorting arraylist conditional-statements

我的问题是如何使用其中一个属性从自定义Object对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 Sauer

谢谢,我稍微编辑了你的代码并更改了返回值,它确实有效!

编辑代码:

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

3 个答案:

答案 0 :(得分: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;    
    }
  }
}

这显然是非常未经测试的,可能有一些一个错误,可能会翻转-1/1值。但它应该向你展示基本的想法; - )

答案 1 :(得分:1)

使用ArrayList子列表方法创建子列表,然后对此子列表进行排序。

答案 2 :(得分:0)

未经测试,但您明白了:您有两种情况

  • 这两个数字都低于起始数字(在您的示例中为3)或两者都高于==&gt;比较它们
  • 一个数字低于起始编号,另一个数字高于==&gt;第一个是在自定义排序顺序中的第二个之后:

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;
}