2016-07-25 110 views
-1

後發現原來的指數我有類似下面的功能:剝離字符串

int getIndex(String noisyString) { 
    String quietString = noisyString.replaceAll("[^a-z]", ""); 

    int quietStringIndex = findIndexInQuietString(quietString); 

    return originalIndexInNoisyString; // ??? 
} 

剝離所有非字母字符的字符串後,我找到了剝離字符串內任意選擇索引。我怎樣才能將這個索引轉換回可以用於未劃分字符串的索引?

+1

您需要一個數據結構來映射原始位置到創建位置。有幾種可能的方法有不同的權衡。在問這個問題之前,你先嚐試了什麼? – Kon

+0

我花了一段時間思考是否需要創建'String#replaceAll'的新實現,否則我看不到創建原始地圖到創建位置的方式。我想知道是否存在一個更優雅的解決方案,或者一些常用的解決方案。 – konsolas

+0

如果你任意選擇的索引是,比如說42,那麼只需遍歷原始字符串,直到找到第42個字符爲字母字符。 – FredK

回答

0

聽起來好像您正試圖在篩選字符串中所選索引處的相同字符的未篩選字符串中獲取索引。

(也就是說,你有一個字符串s1 =「abc123def」s1.replaceAll()=「abcdef」你想獲得索引爲4的字符的原始索引 索引爲4的字符在過濾的字符串中是e。它在未過濾字符串中的索引值是7.)

最簡單的蠻力方法是使用計數器來檢查字符串是否跟蹤您所使用的索引同時有一個單獨的計數器變量來跟蹤已過濾的字符串有效的字符數。

public static int getOriginalIndex(String s, int index){ 

    if (index > s.replaceAll("[^a-z]", "").length()) { 
     throw new IllegalArgumentException("index is invalid"); 
    } 

    int counter; 
    int validCharCounter = 0; 

    for (counter = 0; counter < s.length() && validCharCounter < index; counter++) { 

     if (s.charAt(counter) >= 'a' && s.charAt(counter) <= 'z') 
      validCharCounter++; 

    } 

    return counter; 
}