如何在不使用String类的length()
方法的情况下找到字符串的长度?
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()
? :-)
String blah = "HellO";
int count = 0;
for (char c : blah.toCharArray()) {
count++;
}
System.out.println("blah's length: " + count);
由于还没有人发布淘气的后门方法:
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);
}
;)
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 错误。由于编译器不知道它将始终返回一个值,因此可能无法编译。 - aioobefinally
块。 - b_erbcatch
语句中加入即可,因为这总是会抛出异常。编译器也不会抱怨,因为try
块中的主循环看起来像是永远运行(静态分析)。 - Kevin Brocknull
怎么办?最后的清理工作总是更加干净利落。 - b_erbNullPointerException
,与 myString.length()
相同,并且与我所期望的一样。将返回值放在 finally
中也会产生警告(在 Eclipse 中)。 - Kevin Brock以下是我能想到的最愚蠢的方法:生成所有可能的长度为1的字符串,使用equals(相等)将它们与原始字符串进行比较;如果它们相等,则字符串长度为1。如果没有任何字符串匹配,则生成所有可能的长度为2的字符串,比较它们,对于长度为2的字符串。以此类推,直到找到字符串长度或宇宙结束,无论哪个先发生。
public static int Length(String str) {
str = str + '\0';
int count = 0;
for (int i = 0; str.charAt(i) != '\0'; i++) {
count++;
}
return count;
}
'\0'
字节的情况下,此方法才能正常工作。 - A.H.已经发布了半最佳方法,没有比String#length更好的方法了...
将System.out重定向到FileOutputStream,使用System.out.print(而不是println()!)打印字符串并获取文件大小 - 这等于字符串长度。测量后不要忘记恢复System.out。
;-)
隐藏的 length() 用法:
String s = "foobar";
int i = 0;
for(char c: s.toCharArray())
{
i++;
}
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;
}
这是一个完整的程序,您可以编译并运行它。
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;
}
}
String.length()
是唯一正确的方法。 - poke