Java:寻找检查字符串中是否存在特定范围内的Unicode字符的最快方法

Java:寻找检查字符串中是否存在特定范围内的Unicode字符的最快方法,java,string,unicode,Java,String,Unicode,我需要实现一个非常粗糙的语言识别算法。在我的世界里,只有两种语言:英语和非英语。我有ArrayList,我需要确定每个字符串是否可能是英语或其他语言,其Unicode字符在一定范围内。所以我想做的是使用某种类型的“存在”测试来检查这个范围内的每个字符串。如果它通过测试,我说字符串不是英语,否则就是英语。我想尝试两种类型的测试: TEST-ANY:如果字符串中的任何字符在该范围内,则该字符串通过测试 TEST-ALL:如果字符串中的所有字符都在该范围内,则该字符串通过测试 由于数组可能很长,我需要

我需要实现一个非常粗糙的语言识别算法。在我的世界里,只有两种语言:英语和非英语。我有ArrayList,我需要确定每个字符串是否可能是英语或其他语言,其Unicode字符在一定范围内。所以我想做的是使用某种类型的“存在”测试来检查这个范围内的每个字符串。如果它通过测试,我说字符串不是英语,否则就是英语。我想尝试两种类型的测试:

  • TEST-ANY:如果字符串中的任何字符在该范围内,则该字符串通过测试
  • TEST-ALL:如果字符串中的所有字符都在该范围内,则该字符串通过测试
  • 由于数组可能很长,我需要非常有效地实现它。在Java中,最快的方法是什么

    Thx


    更新:我通过查看特定范围的Unicode,而不是检查字符是否为ASCII,专门检查非英语字符,部分是为了解决下面提到的“简历”问题。我想弄清楚的是,Java是否提供了能够尽可能高效地实现TEST-any或TEST-ALL(或其他类似测试)的类/方法。换句话说,我试图避免重新发明轮子,尤其是如果我之前发明的轮子更好的话。

    我真的不认为这个解决方案是确定语言的理想方案,但是如果你想检查字符串是否都是ascii,你可以这样做:

    public static boolean isASCII(String s){
        boolean ret = true;
        for(int i = 0; i < s.length() ; i++) {
            if(s.charAt(i)>=128){
                ret = false;
                break;
            }
        }
        return ret;
    }
    
    r
    将等于true。但如果你尝试:

    boolean r = isASCII("Grüß dich");
    
    然后
    r
    将等于false。我还没有测试性能,但这将相当快,因为它所做的只是将一个字符与数字128进行比较

    但是正如上面评论中提到的@AlexanderPogrebnyak,如果你给它“résumé”,它将返回false。请注意这一点

    更新: 我通过查看特定范围的Unicode,而不是检查字符是否为ASCII,专门检查非英语字符

    但是ASCII在Unicode中是一个范围(至少在UTF-8中是这样)。Unicode只是ASCII的扩展。什么是代码@mP。我提供的功能是检查每个字符是否在某个范围内。我选择的范围是ASCII,这是任何十进制值小于128的Unicode字符。你也可以选择任何其他范围。但我选择ASCII的原因是因为它包含拉丁字母、阿拉伯数字和其他一些常用字符,这些字符通常在“英语”字符串中。

    public static boolean isAscii(字符串s){
    
    public static boolean isAscii( String s ){
        int length = s.length;
        for( int i = 0; i < length; i++){
           final char c = s.charAt( i );
           if( c > 'z' ){
              return false;
           }
        }
        return true;
    }
    
    int-length=s.length; for(int i=0;i‘z’){ 返回false; } } 返回true; }

    @Hassan感谢您选择了用小Z替换大Z的打字错误测试。

    以下是我最终实现test-ANY的方式:

    // TEST-ANY
    String str = "wordToTest";
    int UrangeLow = 1234; // can get range from e.g. http://www.utf8-chartable.de/unicode-utf8-table.pl
    int UrangeHigh = 2345;
    for(int iLetter = 0; iLetter < str.length() ; iLetter++) {
       int cp = str.codePointAt(iLetter);
       if (cp >= UrangeLow && cp <= UrangeHigh) {
          // word is NOT English
          return;
       } 
    }
    // word is English
    return;
    
    //TEST-ANY
    String str=“wordToTest”;
    int UrangeLow=1234;//可以从例如。http://www.utf8-chartable.de/unicode-utf8-table.pl
    国际保险高=2345;
    对于(int-iLetter=0;iLetter如果(cp>=UrangeLow&&cp如果字符串都是拉丁字母,它仍然可能是非英语的。还要注意的是,有些单词(如“résumé”),将其翻译成英语,带有非ASCII口音。实现这一点没有秘密的忍者诀窍。你需要迭代数组中的每个字符,并检查它是否在给定的unicode字符范围内。想象一下执行此检查的最简单代码,然后实现它。你的代码之所以昂贵,仅仅是因为toCharArray创建整个数组的副本。最好逐字符获取字符,以防第一个字符是非ascii字符,这会使整个副本成为浪费。我知道在数组上循环比charAt快,但仍然是错误的。您的代码也错了。为什么返回布尔值,用布尔值替换它。@mP。让人检查您的代码总是好的。比ks,已修复。@Hassan正如我在更新中所述,目标是能够检查任何Unicode范围,也就是说,这不仅适用于ASCII,而且适用于更广泛的范围。正如我在原始帖子中所述,如果字符串未通过测试,我必须检查非英语,并声明英语。我会将“Z”改为else,因为整个小写字母和其他一些字符都在“Z”之后。
    
    // TEST-ANY
    String str = "wordToTest";
    int UrangeLow = 1234; // can get range from e.g. http://www.utf8-chartable.de/unicode-utf8-table.pl
    int UrangeHigh = 2345;
    for(int iLetter = 0; iLetter < str.length() ; iLetter++) {
       int cp = str.codePointAt(iLetter);
       if (cp >= UrangeLow && cp <= UrangeHigh) {
          // word is NOT English
          return;
       } 
    }
    // word is English
    return;