不使用length()方法求字符串长度

10

如何在不使用String类的length()方法的情况下找到字符串的长度?


8
这是作业吗? - Robert Harvey
8
为什么需要用不同的方式来做呢?String.length()是唯一正确的方法。 - poke
1
你是否将Java字符串与C/C++中的空终止字符串混淆了?JLS 10.9字符数组不是字符串(http://java.sun.com/docs/books/jls/third_edition/html/arrays.html#10.9) - polygenelubricants
5
这有什么意义?这是作业吗?还是一些毫无价值和恶意的面试问题? - Jesper
只需使用任何内置函数,即可获得字符串长度。如果您选择其他替代方法,则必须使用其他内置函数来实现此目标。 - Girdhar Singh Rathore
14个回答

44
  • str.toCharArray().length应该可以工作。

  • 或者这样:

    str.lastIndexOf("")

    很可能甚至以恒定时间运行 :)

  • 另一个

    Matcher m = Pattern.compile("$").matcher(str);
    m.find();
    int length = m.end();
    
  • 最愚蠢的解决方案之一: str.split("").length - 1

  • 这算不算作弊呢: new StringBuilder(str).length()? :-)


不错。不过需要提醒一下(不是针对aioobe,而是针对普通读者),它会创建一个新的数组对象并复制所有字符。显然,没有比String.length()更好的方法了。 - Kevin Brock

25
String blah = "HellO";
int count = 0;
for (char c : blah.toCharArray()) {
    count++;
}
System.out.println("blah's length: " + count);

这实际上是我所期望的答案。 - Shane Chin
这是我找到的最简单和最好的答案了。 - Shubham Pandey

19

由于还没有人发布淘气的后门方法:

public int getLength(String arg) {
  Field count = String.class.getDeclaredField("count");
  count.setAccessible(true); //may throw security exception in "real" environment
  return count.getInt(arg);
}

;)


5
我完全支持这个解决方案用于这个平凡且限制奇怪的任务 :) - Esko
7
如果我在真实世界的代码中发现你干了类似这样的事情,你最终会出现在thedailywtf.com上;-) - Jesper

13
你可以使用循环来检查每个字符的位置,并在超过最后一个字符时捕获IndexOutOfBoundsException异常。但为什么要这样做?
public int slowLength(String myString) {
    int i = 0;
    try {
        while (true) {
            myString.charAt(i);
            i++;
        }
    } catch (IndexOutOfBoundsException e) {
       return i;
    }
}

注意:这是非常糟糕的编程实践,非常低效。

您可以使用反射来检查String类中的内部变量,特别是count


缺少一个 } 并且存在一处 off-by-one 错误。由于编译器不知道它将始终返回一个值,因此可能无法编译。 - aioobe
1
返回i属于finally块。 - b_erb
@aioobe:发现得好,谢谢。当你留下评论时,我可能正在修正偏移量问题。 - Kevin Brock
@PartlyCloudy:没问题,只需要在catch语句中加入即可,因为这总是会抛出异常。编译器也不会抱怨,因为try块中的主循环看起来像是永远运行(静态分析)。 - Kevin Brock
一个字符串如果是null怎么办?最后的清理工作总是更加干净利落。 - b_erb
@Partly - 抛出 NullPointerException,与 myString.length() 相同,并且与我所期望的一样。将返回值放在 finally 中也会产生警告(在 Eclipse 中)。 - Kevin Brock

9

以下是我能想到的最愚蠢的方法:生成所有可能的长度为1的字符串,使用equals(相等)将它们与原始字符串进行比较;如果它们相等,则字符串长度为1。如果没有任何字符串匹配,则生成所有可能的长度为2的字符串,比较它们,对于长度为2的字符串。以此类推,直到找到字符串长度或宇宙结束,无论哪个先发生。


喜欢它 - 绝对是这个愚蠢问题的最佳解决方案。 - user949300

6
尝试下面的代码。
    public static int Length(String str) {
    str = str + '\0';
    int count = 0;

    for (int i = 0; str.charAt(i) != '\0'; i++) {
        count++;
    }

    return count;
    }

1
只有在原始字符串中没有包含 '\0' 字节的情况下,此方法才能正常工作。 - A.H.

4

已经发布了半最佳方法,没有比String#length更好的方法了...

将System.out重定向到FileOutputStream,使用System.out.print(而不是println()!)打印字符串并获取文件大小 - 这等于字符串长度。测量后不要忘记恢复System.out。

;-)


注意Unicode问题!将“Größte”写入UTF-8编码的文件中会创建一个大小为8字节的文件 - 但该字符串仅有6个字符长。 - Erich Kitzmueller

3

隐藏的 length() 用法:

    String s = "foobar";

    int i = 0;
    for(char c: s.toCharArray())
    {
        i++;
    }

3
这里还有另一种方法:
int length = 0;
while (!str.equals("")) {
    str = str.substring(1);
    ++length;
}

以同样的精神(尽管效率远不如此):
String regex = "(?s)";
int length = 0;
while (!str.matches(regex)) {
    regex += ".";
    ++length;
}

甚至可以这样:
int length = 0;
while (!str.matches("(?s).{" + length + "}")) {
    ++length;
}

3

这是一个完整的程序,您可以编译并运行它。

import java.util.Scanner;

class Strlen{

    public static void main(String...args){
        Scanner sc = new Scanner(System.in);
        System.out.print("\nEnter Your Name =>" +"  ");
        String ab = sc.nextLine();
        System.out.println("\nName Length is:" +len(ab));
    }

    public static int len(String ab){
        char[] ac = ab.toCharArray();
        int i = 0, k = 0;

        try{
            for(i=0,k=0;ac[i]!='\0';i++)
                k++;
        }
        catch(Exception e){
        }
        return k;
    }

}

代码片段很有用,但应该应用Markdown以确保它显示为代码。 - andersoj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接