5

I am implementing Comparable interface on a trivial class that wraps a single int member.

I can implement it this way:

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

But this (maybe) creates 2 totally unnecessary Integer objects.

Or I can go tried and true cut-and-paste approach from Integer class:

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

This is pretty efficient, but duplicates code unnecessary.

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

   public static int compare ( int v1, int v2 );
Alexander Pogrebnyak
  • 44,836
  • 10
  • 105
  • 121
  • 1
    Could you copy the Integer `compareTo()` to a new method that takes two arguments instead of using `this`? – BenCole Sep 01 '11 at 16:10

4 Answers4

6

In Java 7, static int compare for primitive types have been added to all primitive object wrapper classes, i.e there is now:

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...
Alexander Pogrebnyak
  • 44,836
  • 10
  • 105
  • 121
6
  • For int, write your own compare method (it requires at most three lines of code).
  • For double, use Double.compare (not to be confused with compareTo).
  • For float, use Float.compare.

The last two take primitive types and thus avoid boxing and unboxing. I can see an argument for Integer providing a similar compare method, but as things stand it doesn't.

NPE
  • 486,780
  • 108
  • 951
  • 1,012
2

Maybe, I'm missing something, but IMHO this is a weird question.

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

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

Well, I think this does the job:

public static int compare ( int v1, int v2 )
{
    if (v1 < v2) return -1;
    if (v1 > v2) return  1;
    return 0;
}
Martijn Courteaux
  • 67,591
  • 47
  • 198
  • 287
  • 2
    @barjak: Nope, please check http://stackoverflow.com/questions/7273091/is-there-a-library-to-compare-primitive-type-values/7273222#7273222 and it comments. – Martijn Courteaux Sep 01 '11 at 16:20
-1

This solution is simple, but perhaps simplistic:

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

Note: @aix is correct! This approach will not work for arbitrary integers. It will work for always-positive integers though, for example auto generated database keys etc

Bohemian
  • 412,405
  • 93
  • 575
  • 722
  • 6
    How about integer overflow? – NPE Sep 01 '11 at 16:17
  • 1
    @Martijn Courteaux, you are incorrect, `compare` and `compareTo` specify negative, 0, positive values. It doesn't dictate -1, 0 1. Any code that checks for -1 is bad and broken code. See http://download.oracle.com/javase/6/docs/api/java/lang/Comparable.html#compareTo%28T%29 – Steve Kuo Sep 01 '11 at 16:20
  • 1
    No, the Javadoc says "negative, zero or positive", for both Comparable and Integer. – barjak Sep 01 '11 at 16:22
  • @Steve Kuo: Oops, indeed! Thanks, I learnt something today :D – Martijn Courteaux Sep 01 '11 at 16:23