2010-12-15 119 views
2

今天早上我感到好奇,是遊蕩,如果有人有更好的方法來做到這一點的Java:字符串:有沒有更好的方法來比較字符串

if(TAG_PLAY.equalsIgnoreCase(e.getActionCommand()) 
    ||TAG_PASSWORD.equalsIgnoreCase(e.getActionCommand()) 
    ||... 
){ 

我有一種預感,這可以提高通過執行類似 創建1個大串,並在其中 尋找e.getActionCommand(),但我不知道它是否會更有效

注:此無關與getActionCommand,我純粹感興趣的邏輯,性能和新的方法/模式做同樣的事情


編輯:我不考慮大小寫的辯論^^


編輯:

如何:

s = TAG_PLAY+","+TAG_PASSWORD; 
//compareToIgnoreCase is not optimal since it will go through all the String 
    if(0!=s.compareToIgnoreCase(anotherString)){ 

回答

8

你有沒有使用Set.contains(對象)考慮?

例如:

Set<String> cases = new HashSet<String>(); 
    cases.add(TAG_PLAY.toLowerCase()); 
    cases.add(TAG_PASSWORD.toLowerCase()); 

    ... 
    if (cases.contains(e.getActionCommand().toLowerCase()) { 
    ... 
+0

如果將保證不會重複添加(或即使是 - 無論在這裏作爲'contains'只需要找到一個),那麼'[Array] List'也會起作用。一個 「優勢」 使用列表(對比組)是'Arrays.asList(TAG_PLAY.toLowerCase(),TAG_PADDWORD,....)'。就個人而言,我被拖放到'toLowerCase'的重複,但Java遺憾地缺乏[n簡單]「地圖」構造。對於微不足道的n,O(n)與O(1)辯論在這裏基本上是無關緊要的。 – 2010-12-15 04:31:12

+0

你也可以在一個語句中創建一個集合 - 新的HashSet(Arrays.asList(TAG_PLAY.toLowerCase(),TAG_PASSWORD.toLowerCase(),....)))。 – 2010-12-15 05:08:44

0

這看起來像一個enum的好候選人。一個簡單的例子是:

public enum TagType 
{ 
    TAG_PLAY, 
    TAG_PASSWORD 
} 

但是,你可以詳細說明這一點。 Java枚舉提供了整數(用於比較)的性能以及對象的類型安全性和行爲。因爲它是類型安全的,所以您不必擔心e.getActionCommand()不等於是有效的TAG。

+0

ActionCommand需要一個字符串(除非有更改)的方式,因此將枚舉完善的檢測? – 2010-12-15 04:31:28

+0

@Jason,我想我誤解了。我解釋「無關的getActionCommand」的意思是不同的API w ^作爲一個選項。 – 2010-12-15 05:34:45

+0

對不起,如果我不清楚,我的意思是,我純粹是在談論比較字符串,並且命令的getAction只是在代碼示例我不得不派上用場 – 2010-12-15 05:54:40

5

如果您正在實施的字符串匹配的數據結構,您可能需要某種形式的Trie

如果你只是要做到這一點在Java中沒有的代碼堆,扔掉所有你要匹配一組字符串,然後檢查你的目標字符串是否在設定的。

0

你可以做

final String upperCaseCommand = e.getActionCommand().toUpperCase(); 
if(TAG_PLAY.equals(upperCaseCommand) 
    ||TAG_PASSWORD.equals(upperCaseCommand) 
    ||... 
){ 

(當然,這些常數也需要大寫。

你也可以把它們放在一個哈希值。

if (tags.containsKey(upperCaseCommand)) 
相關問題