2015-04-03 25 views
6

我意識到string1.compareTo(string2)的結果將是一個數字-1或以下,如果string2在字符串1之前出現,並且數字1或以上,如果不同另一個方向。我只需要返回-1,0或1.如何最好地將String.compareTo()結果限制爲-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?


編輯:我不得不說,我很高興只是問,這不是downvoted和刪除的問題,但提示和智能響應是美妙的。這是我迄今測試的答案。我想和後來的人分享我的結果。

我的測試代碼:(運行約爲不同的值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.5毫秒

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由於速度和可讀性而獲得複選標記,所以特別感謝您。

+1

有'Math.signum'但是隻需要一個'float'或'double';使用它並鑄造你的'int',結果將不會比你已經做的更有效率。 – Jesper 2015-04-03 06:00:35

+0

那麼在使用可比較的工具時,沒有更簡單的方法。使用可能需要重寫你的String類並指出什麼是更大的字符串?它是長度嗎?是字母順序嗎?使用可比較的工具,您將獲得小於/大於零的值。 – 2015-04-03 06:02:12

+0

@Barak Kedem:字符串是最後一堂課。祝你好運,試圖覆蓋它 – Stultuske 2015-04-03 06:07:55

回答

4

這其實很簡單:

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

我檢查了這個以確保它能夠正常工作,而且確實如此。儘管文檔只是說它給出了一個「正數」或「負數」作爲輸出,但它似乎始終是-1,0或1.任何捕獲這種方法都會導致意外結果? – randomraccoon 2015-04-03 07:35:24

+0

不,如果你檢查它的源代碼,它只是說'返回左'<右? -1:左>右? 1:0;' – 2015-04-03 08:15:13

+0

太棒了,謝謝! – randomraccoon 2015-04-03 09:20:45

3

三元運營商將更加緊湊:

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

Math.signum也可以使用,但需要強制轉換爲int:

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

Math.signum()提供你問什麼:

返回參數的符號函數;如果參數爲零,則爲零;如果參數大於零,則爲1.0;如果參數小於零,則爲-1.0。

+0

但是它需要一個'float'或'double' - int','float'或'double',以及'signum'的結果回到'int',都不會使它更有效率。 – Jesper 2015-04-03 06:01:29

+0

它是優雅的,你在問什麼。它有效嗎?一般般。 – mtyurt 2015-04-03 06:03:55

+0

但效率不高。如果您在JDK中查看'Math.signum'的源代碼,您會發現它比randomraccoon已經做的更復雜。 – Jesper 2015-04-03 06:03:59

2

您可以使用最小值和最大值來限制值範圍。這是一個有用的方法,有時,所以你可以使用它作爲一個工具方法:

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)); 
} 

更優雅?我會這樣說。更高效?可能不會。

相關問題