我意识到如果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获得了复选标记,所以特别感谢您。
答案 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));
}
更优雅?我会这么说的。更高效?可能不是。