2016-07-25 101 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; 
}