0

我有一个员工集合。每个员工都有一个 ID。此 ID 号的格式为 -x >= 0 >= x 。我必须将员工排序为 0...x -1....-x。我怎样才能做到这一点??

List<Employee> empSort = new ArrayList(em.getEmployees());
Collections.sort(empSort, new Comparator<Employee>() {
                @Override
                public int compare(Employee p1, Employee p2) {
                   // WHAT LOGIC SHOULD I DO THERE TO HAVE THEM
                                      SORTED AS 0...x -1....-x
                }
            });
4

4 回答 4

2

晚餐时考虑一下,我更喜欢这个。

int sign1 = (p1 >= 0) ? 1 : -1;
int sign2 = (p2 >= 0) ? 1 : -1;

int result = Integer.compare(sign2, sign1);

if( result == 0){
    // same sign
    result = sign1 * Integer.compare(p1, p2);
}
return result;

输出仍然是:

[0, 0, 0, 1, 3, 5, -1, -2]
于 2013-01-15T18:41:55.537 回答
1

你不能做三个测试吗?

非负先于负。 return如果恰好一个是负数。

如果两者都是负数,则较大的值在较小的值之前。

如果两者都是非负数,则较小的值在较大的值之前。

于 2013-01-15T17:44:53.950 回答
0

比较返回负整数、零或正整数,因为第一个参数小于、等于或大于第二个。

if( p1.id * p2.id < 0 ) {
    // opposite sign
    // if p1 is negative, p2 is positive, p1 is greater than p2
    // otherwise p1 is positive, p2 is negative, p1 is less than p2
    return -p1.id;
}
if( p1.id > 0 && p2.id > 0 || p1.id + p2.id >= 0) {
    // both positive, normal ordering or a zero and a positive number, also normal ordering
    return p1.id - p2.id;
}
if( p1.id <0 && p2.id < 0 ){
    // both negative, inverse ordering
    return p2.id - p1.id;
}
// zero and a negative number, zero comes first
if( p1.id == 0 ) {
    return -1;
}
return 1;

[0, 0, 0, 1, 3, 5, -1, -2]

于 2013-01-15T17:57:29.603 回答
0

这很模糊,但你可以做到

Integer.compare(x >= 0 ? x + Integer.MIN_VALUE : ~x, y >= 0 ? y + Integer.MIN_VALUE);

甚至更晦涩

Integer.compare(x ^ (-1 << ~(x >> -1)), y ^ (-1 << ~(y >> -1)))

注意:相同的公式适用于longs ;)

这将 [0, Integer.MAX_VALUE] 映射到 [Integer.MIN_VALUE, -1] 并且 [Integer.MIN_VALUE, -1] 被翻转到 [0, Integer.MAX_VALUE]

于 2013-01-15T21:49:08.223 回答