如何在不使用String类的length()
方法的情况下找到String的长度?
答案 0 :(得分:41)
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()
? : - )
答案 1 :(得分:22)
String blah = "HellO";
int count = 0;
for (char c : blah.toCharArray()) {
count++;
}
System.out.println("blah's length: " + count);
答案 2 :(得分: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);
}
)
答案 3 :(得分:11)
您可以使用循环检查每个字符位置,并在传递最后一个字符时捕获IndexOutOfBoundsException
。但为什么呢?
public int slowLength(String myString) {
int i = 0;
try {
while (true) {
myString.charAt(i);
i++;
}
} catch (IndexOutOfBoundsException e) {
return i;
}
}
注意:这是非常糟糕的编程习惯,效率非常低。
您可以使用反射来检查String
类中的内部变量,特别是count
。
答案 4 :(得分:8)
用我能想出的最愚蠢的方法完成这个:生成长度为1的所有可能的字符串,使用equals将它们与原始字符串进行比较;如果它们相等,则字符串长度为1.如果没有字符串匹配,则生成长度为2的所有可能字符串,比较它们,对于字符串长度2.等等。继续,直到找到字符串长度或Universe结束,无论先发生什么。
答案 5 :(得分: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;
}
答案 6 :(得分:4)
对于已发布的半最佳方法,没有什么比String#length ...
更好的了将System.out重定向到FileOutputStream,使用System.out.print(而不是println()!)来打印字符串并获取文件大小 - 这等于字符串长度。测量后不要忘记恢复System.out。
- )
答案 7 :(得分:3)
隐藏长度()用法:
String s = "foobar";
int i = 0;
for(char c: s.toCharArray())
{
i++;
}
答案 8 :(得分: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;
}
答案 9 :(得分: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;
}
}
答案 10 :(得分:2)
只是为了完整性(这根本不推荐):
int length;
try
{
length = str.getBytes("UTF-16BE").length / 2
}
catch (UnsupportedEncodingException e)
{
throw new AssertionError("Cannot happen: UTF-16BE is always a supported encoding");
}
这是有效的,因为char
是UTF-16代码单元,str.length()
返回此类代码单元的数量。每个UTF-16代码单元占用2个字节,因此我们除以2.此外,没有用UTF-16BE写入的字节顺序标记。
答案 11 :(得分:2)
我们可以像字符数组一样迭代字符串,并按照这种方式计算(更为实际的方式):
String s = "foo"
char arr[]=s.toCharArray();
int len = 0;
for(char single : arr){
len++;
}
使用" foreach" for循环的版本
答案 12 :(得分:1)
更慢一点
public int slowerLength(String myString) {
String[] str = myString.split("");
int lol=0;
for(String s:str){
lol++;
}
return (lol-1)
}
甚至更慢,
public int slowerLength(String myString) {
String[] str = myString.split("");
int lol=0;
for(String s:str){
lol += s.toCharArray().length;
}
return lol
}
答案 13 :(得分:1)
非常好的解决方案。还有一些。
int length ( String s )
{
int length = 0 ;
// iterate through all possible code points
for ( int i = INTEGER . MIN_VALUE ; i <= INTEGER . MAX_VALUE ; i ++ )
{
// count the number of i's in the string
for ( int next = s . indexOf ( i , next ) + 1 ; next != -1 ; next = s . indexOf ( i , next ) + 1 )
{
length ++ ;
}
}
return ( length ) ;
}
这是一个递归版本:
int length ( String s )
{
int length = 0 ;
search :
for ( int i = Integer . MIN_VALUE ; i <= Integer . MAX_VALUE ; i ++ )
{
final int k = s . indexOf ( i ) ;
if ( k != -1 )
{
length = length ( s . substring ( 0 , k ) ) + length ( s . substring ( k ) ) ;
break search ;
}
}
return ( length ) ;
}
还有更多
int length ( String s )
{
int length ;
search ;
for ( length = 0 ; true ; length ++ )
{
int [ ] codePoints = new int [ length ] ;
for ( each possible value of codePoints from {MIN_VALUE,MIN_VALUE,...} to {MAX_VALUE,MAX_VALUE,...} )
{
if ( new String ( codePoints ) . equals ( s ) ) { break search ; }
}
}
}
我怎么能忘记一个在合理的时间内有效的? (字符串#length仍然是首选。)
int length ( String s )
{
String t = s . replaceAll ( "." , "A" ) ;
int length ;
String r = "" ;
search :
for ( r = "" , length = 0 ; true ; r += "A" , length ++ )
{
if ( r . equals ( t ) )
{
break search ;
}
}
return ( length ) ;
}