2011-10-28 110 views
3

我需要編寫一個函數來檢查字符串是否有重複值並返回唯一字符的計數。如果計數大於3,它應該返回true。如果計數小於3,則應該是錯誤的。這是我一直想(請注意,我是新來的Java)Java - 如何檢查字符串中的重複字符?

private boolean isFormatValid(String password) { 
    CharSequence inputStr = password; 
    int length = inputStr.length(); 
    int numberDups = 0; 

    for(int i=0; i < length; ++i) { 
     Pattern pattern = Pattern.compile("(.)(?=.*?\1){1,20}"); 
     Matcher matcher = pattern.matcher(inputStr); 
     numberDups += 1; 
    } 
    if (numberDups < 3) { 
     return false; 
    } 
    return true; 
} 

我試圖用一個正則表達式,因爲有人認爲它可能會更容易。但是如果我能在沒有正則表達式的情況下完成這項工作,我會更開心。

這是什麼意思?

private boolean isFormatValid(String password) { 
    int length = inputStr.length(); 
    int numberChars = 0; 

    for(int i=0; i < length; ++i) { 
       int index = password.indexOf(i); 
     CharArray[i] = charAt(i); 
    } 
} 

我覺得這是不是甚至接近是正確的...

+0

我只是簡單地循環,並使用字符串indexOf函數與你正在做的事情。如果你想使用正則表達式,你可以編寫一個正則表達式,你只需要對該字符串使用一次。 – onit

+0

該問題要求的唯一字符的數量,但代碼似乎試圖計數重複....我只是讀這個錯誤? –

+0

G_H - 謝天謝地這不是功課。我是一名初學者開發人員,嘗試通過一些書籍和論壇自行學習JAVA。 – Rich

回答

1

我認爲你的示例代碼中的變量numberDups是錯誤的,這就讓一些人感到困惑。該變量應該代表不同個字符的數量,是不是?也就是說,如果字符串爲abcabc,則數字將爲3,對於字符串aaaaaaaaa,它將是1

既然如此,最簡單的解決方案就像其他人所說的那樣使用Set。事實上,你的代碼幾乎就在那裏;剛剛擺脫numberDups櫃檯,並用HashSet<Character>代替它,就像這樣:

static boolean isFormatValid(String password) { 
    CharSequence inputStr = password; 
    int length = inputStr.length(); 
    Set<Character> uniqueChars = new HashSet<Character>(); 

    for(int i=0; i < length; ++i) { 
     uniqueChars.add(inputStr.charAt(i)); 
    } 

    return uniqueChars.size() >= 3; 
} 

(不過,你不需要創建inputStr變量您可以在password叫CharSequence的方法,如charAt()length()。變量,因爲String實現CharSequence接口)


編輯:我也想指出的是,你的方法是使用模式和Mat cher,你不是使用它們。您從Pattern中正確創建了Matcher,並將其與輸入字符串關聯,但它只是坐在那裏。爲了應用正則表達式,您必須調用其中一種方法,find()matches()(或lookingAt(),但沒有人使用過該方法)。

這是一個非常普遍的初學者的錯誤。無論如何,Java有着過於冗長的聲譽,但在這種情況下,它尤其引人注意(並且令人驚訝)。我的意思是,什麼是正則表達式,如果不是讓你解決問題沒有寫代碼大量?但並不總是那麼糟糕。這裏是使用一個正則表達式的單行溶液:

return inputStr.replaceAll("(.)(?=.*\\1)", "").length() >= 3; 

即,除去所有的重複,並且將所得的字符串的長度是一樣的獨特的字符的數量。儘管如此,基於集合的解決方案仍然更簡單;這個只是更短。

+0

這是非常有用的很好的解釋。我現在要給它一個鏡頭。 – Rich

+1

幾點要點:如果uniqueChars的大小爲3,可以提前退出for循環,而不是遍歷整個String。在這種情況下,你可以創建一個初始容量爲3的HashSet。 – Adamski

+0

不錯的解決方案。謝謝 –

6

你幾乎沒有。您可以使用索引i來索引String並使用charAt(int)來讀取特定字符,而不是使用正則表達式。

然後您需要一個數據結構來跟蹤每個字符的出現次數。我建議使用HashMap來表示,因爲地圖關鍵字是您已閱讀的Character,地圖值是發生次數的Integer

+0

這正是我想要建議的。 –

+0

你能否提供一個你想表達的例子。這種方法聽起來像我想要的。 – Rich

+0

@Rich他很清楚。你在這裏不明白,所以你要求一個例子嗎? –

3

算法很簡單:

  1. 將字符串分割成字符
  2. 的陣列將所有這些字符設置(HashSet的)。

之後,你的設置只包含唯一的字符。

+0

雖然,不會幫助計算出現次數。只檢測是否有重複的字符。 –

+0

告訴我,如果我錯了,問題是「函數檢查字符串的重複值,並*返回唯一字符的計數*」 – mishadoff

+0

我正在調查此建議。 G_H - 這正是我期待做的。 – Rich