如何使用Java比较器忽略某些值进行排序

时间:2011-08-19 22:00:00

标签: java

我正在使用Java Comparator在我的代码中进行排序。我怎么只能按某些值排序,例如,值的范围从1到1000,(默认值是1000),但我只想提升排序以显示1,2,3,4,5,1000 ...,并且降序排序显示5,4,3,2,1,1000 .... 我该怎么做呢? 谢谢,

大卫

4 个答案:

答案 0 :(得分:6)

下面的比较器将值1000视为始终比其他所有值“更大”; 1000将始终排序最后。任何其他值都按升序或降序排序。

class AscendingComp implements Comparator<Integer>
{
    @Override
    public int compare(Integer o1, Integer o2)
    {
        if (o1.equals(o2))   return 0;
        if (o1.equals(1000)) return 1;
        if (o2.equals(1000)) return -1;
        return o1.compareTo(o2);
    }
}
class DescendingComp implements Comparator<Integer>
{
    @Override
    public int compare(Integer o1, Integer o2)
    {
        if (o1.equals(o2))   return 0;
        if (o1.equals(1000)) return 1;
        if (o2.equals(1000)) return -1;
        return o2.compareTo(o1);
    }
}

编辑: 这不是一般解决方案,而是回答具体问题。在一般解决方案中,您必须注意equals()compare()的合同,尤其是确保不会返回不一致的比较结果。例如,如果您不小心并意外返回,请为compare(a,b)compare(b,a)说+1,那么排序可能会进入无限循环。

答案 1 :(得分:0)

为什么不按升序排序,然后按降序排序。您可以将结果添加到List

或者你可以实现你自己的Iterator,其中有一个状态,如果它到达最后一个项目,则切换方向。

答案 2 :(得分:0)

将您不想在第一个列表中排序的值和要在第二个列表中排序的值存储起来。对第二个列表进行排序,然后通过添加第二个列表中第一个列表中的所有项目来重建完整列表。

答案 3 :(得分:0)

这是一个wya做到这一点。请注意,我使用的是低效的结构。你可以用LinkedLists以外的东西做得更好!

List<Integer> ignoredValues = new LinkedList<Integer>();

ignoredValues.add(1000);

List<Integer> copy = new LinkedList<Integer>();
copy.addAll(original);
copy.removeAll(ignoredValues);
sort(copy);

original.retainAll(ignoredValues);

copy.addAll(original);