2013-11-14 120 views
1

所以,我要檢查,如果輸入的位置是在國際象棋棋盤有效,如何檢查字符串是否等於有效字符之一? (棋盤)

//returns true if the position is in the range of A1-H8 

private boolean isValid(String position){ 
    char first=position.charAt(0); 
    String letter=(""+first).toLowerCase(); 
    boolean validLetter=position.equals("a") || position.equals("b") || position.equals("c")|| 
      position.equals("d") || position.equals("e")|| position.equals("f") || position.equals("g") || 
      position.equals("h"); 

正如你可以看到布爾是相當難看,那麼什麼是這樣做的更好的辦法?

順便說一句,你如何檢查第二個字符是否是一個數字?

===編輯==== 謝謝大家!但是你的答案對我來說似乎太複雜了,我剛開始學習java,那麼請你給我一個更基本的解決方法?

+2

也許位置應該有自己的類 –

+0

可以(預處理)創建位置的'Map',然後檢查是否'map.get(位置)== NULL ' – alfasin

+0

我將委託給你宇宙的祕密...... regEx! –

回答

6

正則表達式使得這短暫的工作是:

private boolean isValid(String position) { 
    return position.matches("^[a-h][1-8]$"); 
} 

如果你用正則表達式不舒服,也許這樣的事情會更適合你:

private boolean isValid(String position) { 
    if (position.length() != 2) { 
     return false; 
    } 
    char firstChar = position.charAt(0); 
    List<Character> validFirstChars = Arrays.asList('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'); 
    if (!validFirstChars.contains(firstChar)) { 
     return false; 
    } 
    char secondChar = position.charAt(1); 
    List<Character> validSecondChars = Arrays.asList('1', '2', '3', '4', '5', '6', '7', '8'); 
    if (!validSecondChars.contains(secondChar)) { 
     return false; 
    } 
    return true; 
} 

作爲優化,validFirstCharsvalidSecondChars可能被做成final static類的成員,而不是在每個方法調用上實例化。

+1

非常適合正則表達式問題的優雅解決方案。 – blalasaadri

+1

哇,看起來非常清楚,非常感謝,但我認爲它太高級,所以我的老師不會允許我這樣做.. –

+0

@Asaph出於好奇,會使用'List'比類似''更快ABCDEFGH」 .indexOf(焦炭)'? (另外,國際象棋通常先有字母,然後是數字) –

0

字符在Java中是真正的整數,可以用來檢查一個字符是否落在一定範圍內。所以,你可以檢查字符在上述範圍內97至104(這是「A」到ascii「H」的值):

return first < 105 && first > 96; 

(你可以閱讀更多關於字符在my page here :)

+0

(這可能是一個好主意,提到你從哪裏得到97和104,只是對於那些後來碰到這個問題的人:)) –

+0

對我來說是完全合理的!謝謝! –

+0

@ DennisMeng,添加到ascii表的鏈接。 – Ari

0

一個很簡單的例子:

private boolean isValid(String position) { 
    // We will check only strings with 2 characters 
    if (position.length() != 2) { 
    return false; 
    } 
    // If the first char is not between a and h, let's return false. 
    char first = position.charAt(0); 
    if (first < 'a' || 'h' < first) { 
    return false; 
    } 
    // If the second char is not between 1 and 8, let's return false. 
    char second = position.charAt(1); 
    if (second < '1' || '8' < second) { 
    return false; 
    } 
    // We couldn't prove the position was invalid, so it must be valid. 
    return true; 
} 
相關問題