有没有一个库可以比较原始类型值?

5

我正在一个简单的包装单个int成员变量的类上实现Comparable接口。

我可以这样实现:

    @Override
    public int compareTo ( final MyType o )
    {
        return
            Integer.valueOf( this.intVal ).compareTo(
                Integer.valueOf( o.intVal )
            );
    }

但这样(可能)会创建两个完全不必要的整数对象。

或者我可以采用Integer类中经过验证的剪切和粘贴方法:

    @Override
    public int compareTo ( final MyType o )
    {
      int thisVal = this.intValue;
      int anotherVal = o.intValue;
      return (thisVal<anotherVal ? -1 : (thisVal==anotherVal ? 0 : 1));
    }

这很高效,但是重复了不必要的代码。

有没有一个库可以实现这个缺失的 Integer ( 还有 Double 和 Float ) 方法呢?

   public static int compare ( int v1, int v2 );

1
你能否将整数 compareTo() 复制到一个新方法中,该方法接受两个参数而不是使用 this - BenCole
4个回答

6

在Java 7中,所有原始对象包装器类都添加了对基本类型的static int compare方法,即现在有:

java.lang.Integer: static int compare( int x, int y );
java.lang.Byte: static int compare( byte x, byte y );
java.lang.Short: static int compare( short x, short y );
etc...

6
  • 对于 int,编写自己的 compare 方法(至多需要三行代码)。
  • 对于 double,使用 Double.compare (不要与compareTo 混淆)。
  • 对于 float,使用 Float.compare

后两个方法接受原始类型参数,从而避免装箱和拆箱。我可以看出 Integer 提供了类似的 compare 方法的争议,但就目前情况而言,它没有提供。


1
Integer 也有一个 compare - Steve Kuo
@Steve Kuo:请提供Javadoc的链接。 - NPE
你说得对。我想的是 compareTo,在这种情况下他可以使用 Integer.valueOf(i1).compareTo(i2) - Steve Kuo
@Steve Kuo:不,它并不会,这就是重点。顺便说一下,如果你已经阅读了问题,我知道如何使用Integer.valueOf - Alexander Pogrebnyak
对于byte、short、int和float类型,您可以使用Double.compare()函数。 - Peter Lawrey

2
也许我漏掉了什么,但在我看来这是一个奇怪的问题。

Is there a library that would implement this missing Integer ( and Double and Float ) method?

public static int compare ( int v1, int v2 );

好的,我认为这可以完成任务:

public static int compare ( int v1, int v2 )
{
    if (v1 < v2) return -1;
    if (v1 > v2) return  1;
    return 0;
}

2
@barjak:不是的,请查看https://dev59.com/41rUa4cB1Zd3GeqPn9xg#7273222及其评论。 - Martijn Courteaux

-1

这个解决方案很简单,但也许过于简单了:

public static int compare ( int v1, int v2 )
{
    return v1 - v2;
}

注意:@aix是正确的!这种方法对于任意整数都不起作用。但它对于始终为正的整数有效,例如自动生成的数据库键等。

6
整数溢出怎么处理? - NPE
1
@Martijn Courteaux,您是错误的,comparecompareTo指定负数、0、正数值。它并不规定-1、0、1。任何检查-1的代码都是糟糕和有缺陷的代码。请参见http://download.oracle.com/javase/6/docs/api/java/lang/Comparable.html#compareTo%28T%29。 - Steve Kuo
1
不,Javadoc 对于 Comparable 和 Integer 都说了“负数、零或正数”。 - barjak
@Steve Kuo:哎呀,确实如此!谢谢,我今天学到了新东西:D - Martijn Courteaux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接