我的问题是如何使用其中一个属性从自定义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
答案 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)
未经测试,但您明白了:您有两种情况
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;
}