Java 使用Arrays.sort在Integer.MIN_值和Integer.MAX_值之间使用比较器

Java 使用Arrays.sort在Integer.MIN_值和Integer.MAX_值之间使用比较器,java,arrays,integer,comparator,Java,Arrays,Integer,Comparator,我有一个带有int和field的Java类,以及这个问题不需要的其他字段 class MyInteger { int integer; public MyInteger(int integer) { this.integer = integer; } public int getInteger() { return integer; } public void setInteger(int integer) { this.integer =

我有一个带有int和field的Java类,以及这个问题不需要的其他字段

class MyInteger {

  int integer;

  public MyInteger(int integer) {
    this.integer = integer;
  }

  public int getInteger() {
    return integer;
  }

  public void setInteger(int integer) {
    this.integer = integer;
  }

}
现在我测试我的班级

第一:我用整数创建了数组

int size = 12;
MyInteger[] integers = new MyInteger[size];
for (int p = 0; p < size; p++) {
  integers[p] = new MyInteger(
      java.util.concurrent.ThreadLocalRandom.current().nextInt(
      Integer.MIN_VALUE, Integer.MAX_VALUE)
    );
}
我知道,因为有时候(int2-int1)的容量(以位为单位)比简单的int大 我的更好选择是什么?

您只需在比较器中使用即可实现这一点:

Arrays.sort(integers, (i1, i2) -> Integer.compare(i2.getInteger(), i1.getInteger()));
甚至更短,使用:

两种情况下的结果应如下所示:

DESCENDING
p:0 ->   2023840480
p:1 ->   1411652946
p:2 ->   1329894719
p:3 ->   1158939955
p:4 ->    652971815
p:5 ->   -118538025
p:6 ->   -157722835
p:7 ->  -1370854542
p:8 ->  -1925460195
p:9 ->  -1937778542
您只需在比较器中使用即可实现这一点:

Arrays.sort(integers, (i1, i2) -> Integer.compare(i2.getInteger(), i1.getInteger()));
甚至更短,使用:

两种情况下的结果应如下所示:

DESCENDING
p:0 ->   2023840480
p:1 ->   1411652946
p:2 ->   1329894719
p:3 ->   1158939955
p:4 ->    652971815
p:5 ->   -118538025
p:6 ->   -157722835
p:7 ->  -1370854542
p:8 ->  -1925460195
p:9 ->  -1937778542

我认为
Integer.compare的实际实现并不相关。重要的是,使用减号代替比较是错误的,而
Integer.compare
将正确地进行比较。JVM的优化器很可能会替换对
Integer的调用。通过内部操作比较
,但不管它是如何工作的,都可以保证不会出现像使用减号has这样的溢出问题。@Holger是的,没错。这只是为了显示OP,使用
Integer.compare()不能有任何溢出问题,因为OP在使用该解决方案时遇到了一些问题。我现在可以删除该部分。我认为
Integer.compare的实际实现与此无关。重要的是,使用减号代替比较是错误的,而
Integer.compare
将正确地进行比较。JVM的优化器很可能会替换对
Integer的调用。通过内部操作比较
,但不管它是如何工作的,都可以保证不会出现像使用减号has这样的溢出问题。@Holger是的,没错。这只是为了显示OP,使用
Integer.compare()不能有任何溢出问题,因为OP在使用该解决方案时遇到了一些问题。我现在可以去掉那部分了。
Arrays.sort(integers, (i1, i2) -> Integer.compare(i2.getInteger(), i1.getInteger()));
Arrays.sort(integers, Comparator.comparingInt(MyInteger::getInteger).reversed());
DESCENDING
p:0 ->   2023840480
p:1 ->   1411652946
p:2 ->   1329894719
p:3 ->   1158939955
p:4 ->    652971815
p:5 ->   -118538025
p:6 ->   -157722835
p:7 ->  -1370854542
p:8 ->  -1925460195
p:9 ->  -1937778542