我怎样才能最好地将String.compareTo()结果限制为-1,0和1?

时间:2015-04-03 05:51:55

标签: java

我意识到如果string2按字母顺序排在string1之前,string1.compareTo(string2)的结果将是-1或更低,如果另一个方向不同,则数字1或更高。我只需要返回-1,0或1。

我可以用看似笨重的方式对其进行编码,但我觉得必须有一种更有效/更优雅的方式来做到这一点。任何帮助将不胜感激!

String s1 = "aardvark";
String s2 = "zebra";
int c = s1.compareTo(s2); // -25
if (c > 0) {
   c = 1;
} else if (c < 0) {
   c = -1;
}

是否存在某种数学运算,将所有正整数更改为1,将所有负整数更改为-1?


编辑:我不得不说,我很高兴只是问了一个没有被投票和删除的问题,但是迅速而聪明的回答非常棒。以下是我到目前为止测试过的答案。我想与稍后来的人分享我的成绩。

我的测试代码:(以不同的值运行每个解决方案大约2600次)

String s1 = "";
String s2 = "m";
for (int i = 0; i < 100; i++) {
   for (char j = 'a'; j < 'z'; j++) {
      s2 = ("" + j);
      solution1(s1.compareTo(s2));
   }
}

我的原始代码:~1.5ms

if (c > 0) {
   c = 1;
} else if (c < 0) {
   c = -1;
}

解决方案1:~4ms

c = (int) Math.signum(c);

解决方案2:~2ms

c = c > 0 ? 1 : c < 0 ? -1 : 0;

解决方案3:~2ms

c = Math.max(-1, Math.min(1, c));

解决方案4:~2ms

c = Integer.compare(c, 0);

我喜欢他们比我原来的更好,所以谢谢大家。由于速度和可读性,解决方案4获得了复选标记,所以特别感谢您。

4 个答案:

答案 0 :(得分:4)

实际上非常简单:

return Integer.compare(s1.compareTo(s2), 0);

答案 1 :(得分:3)

三元运算符会更紧凑:

c = c>0?1:c<0?-1:0;

也可以使用Math.signum,但需要转换为int:

c = (int)Math.signum(c);

答案 2 :(得分:2)

Math.signum()提供了您的要求:

  

返回参数的signum函数;如果参数为零,则为零;如果参数大于零,则为1.0;如果参数小于零,则为-1.0。

答案 3 :(得分:2)

您可以使用min和max来限制值范围。这有时是一种有用的方法,因此您可以将其用作实用方法:

String s1 = "aardvark";
String s2 = "zebra";
int c = s1.compareTo(s2); // -25
return clamp(c, -1, 1);

int clamp(int value, int min, int max) {
    return Math.max(min, Math.min(max, value));
}

更优雅?我会这么说的。更高效?可能不是。