1

将代码从 C++ 转换为 Java 时,转换 std::string 方法(如find_last_of(),find_last_not_of等)的简单方法是什么?

这些 C++ 方法查找任何一组字符的索引。

Java 的 String 类提供indexOf()lastIndexOf(),但它们查找字符或字符串的索引,而不是一组字符中的任何一个。

例如,下面的代码查找不是 ASCII 空格的最后一个字符。

size_t pos = myString.find_last_not_of( " \t\n\r" );
4

3 回答 3

5

一种选择是使用 Guava 的CharMatcher类。

以下是每个单参数 find_*_of() 方法的测试转换。

public int findFirstOf( String sequence, String str ) {
    return CharMatcher.anyOf( str ).indexIn( sequence );
}

public int findFirstNotOf( String sequence, String str ) {
    return CharMatcher.anyOf( str ).negate().indexIn( sequence );
}

public int findLastOf( String sequence, String str ) {
    return CharMatcher.anyOf( str ).lastIndexIn( sequence );
}

public int findLastNotOf( String sequence, String str ) {
    return CharMatcher.anyOf( str ).negate().lastIndexIn( sequence );
}

欢迎其他答案。find_last_not_of()[在 stackoverflow 和其他地方搜索时,我在 Java 中找不到任何东西。第一次通过 Guava 搜索相应功能时,我错过了 CharMatcher。我想记录这个简单的转换以供将来使用。]

于 2013-07-08T19:32:42.717 回答
1

如果你喜欢正则表达式,你可以试试下面的等价物。这可能不是最有效的方法,但如果您不想使用任何 3rd 方库(鉴于此,Java 中的 String 类中没有等效方法),这当然值得考虑。

PS:-如果您对 3rd 方库感到满意,那么我不建议您使用正则表达式来完成此任务,因为这可能很快就会变得难以根据要求进行扩展。

所以,这只是另一种选择:

public int findFirstOf( String sequence, String str ) {
    String regex = "^[^" + Pattern.quote(str) + "]*";
    int index = sequence.length() - sequence.replaceAll(regex, "").length();
    return index == sequence.length() ? -1 : index;
}

public int findFirstNotOf( String sequence, String str ) {
    String regex = "^[" + Pattern.quote(str) + "]*";
    int index = sequence.length() - sequence.replaceAll(regex, "").length();
    return index == sequence.length() ? -1 : index;
}

public int findLastOf( String sequence, String str ) {
    String regex = "[^" + Pattern.quote(str) + "]*$";
    return sequence.replaceAll(regex, "").length() - 1;
}

public int findLastNotOf( String sequence, String str ) {
    String regex = "[" + Pattern.quote(str) + "]*$";
    return sequence.replaceAll(regex, "").length() - 1;
}

我没有测试过上述方法。您可以进行测试,并将结果与​​您获得的相应方法进行比较,看看是否有效。请回来,如果这不起作用。

就 3rd 方库而言,您还拥有 Apache CommonsStringUtils类,具有以下方法:

于 2013-07-08T19:51:52.357 回答
-2
static int findFirstNotOf(String searchIn, String searchFor, int searchFrom) {
    boolean found;
    char c;
    int i;
    for (i = searchFrom; i < searchIn.length(); i++) {
        found = true;
        c = searchIn.charAt(i);
            System.out.printf("s='%s', idx=%d\n",c,searchFor.indexOf(c));
            if (searchFor.indexOf(c) == -1) {
                found = false;
            }
        if (!found) {
            return i;
        }
    }
    return i;
}

static int findLastNotOf(String searchIn, String searchFor, int searchFrom) {
    boolean found;
    char c;
    int i;
    for ( i = searchFrom; i>=0; i--) {
        found = true;
        c = searchIn.charAt(i);
            System.out.printf("s='%s', idx=%d\n",c,searchFor.indexOf(c));
            if (searchFor.indexOf(c) == -1) 
                found = false;
        if (!found)  return i;
    }
    return i;
}

public static void main(String[] args){
    String str =  "look for non-alphabetic characters...";

     int  found = findFirstNotOf(str,"abcdefghijklmnopqrstuvwxyz ",0);

      if (found!=str.length()) {
        System.out.print("The first non-alphabetic character is " + str.charAt(found));
        System.out.print(" at position " + found + '\n');
      }

      found = findLastNotOf(str,"abcdefghijklmnopqrstuvwxyz ",str.length()-1);
      if (found>=0) {
            System.out.print("The last non-alphabetic character is " + str.charAt(found));
            System.out.print(" at position " + found + '\n');
          }
      str = "Please, erase trailing white-spaces   \n";
      String whitespaces =  " \t\f\n\r";

      found = findLastNotOf(str,whitespaces,str.length()-1);
      if (found!=str.length()-1)
        str = str.substring(0,found+1);
      else
        str = "";            // str is all whitespace

     System.out.printf('['+ str +"]\n");
}
于 2020-05-11T15:47:56.333 回答