2010-05-26 64 views
9

如何在不使用String類的length()方法的情況下找到字符串的長度?不使用length()方法的字符串的長度

+6

這是家庭作業? – 2010-05-26 05:47:11

+7

爲什麼你需要以不同的方式去做? 'String.length()'是唯一正確的方法。 – poke 2010-05-26 05:51:26

+1

您是否可能將Java字符串與以空字符串結尾的C/C++混淆? JLS 10.9字符串不是字符串(http://java.sun.com/docs/books/jls/third_edition/html/arrays.html#10.9) – polygenelubricants 2010-05-26 07:00:52

回答

39
  • 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()? :-)

+0

不錯。但提醒(不適用於aioobe,僅適用於普通讀者),它會創建一個新的數組對象並複製所有字符。顯然,沒有比String.length()更好的方法。 – 2010-05-26 05:54:36

10

您可以使用循環來檢查每個字符位置,並在傳遞最後一個字符時捕獲IndexOutOfBoundsException。但爲什麼?

public int slowLength(String myString) { 
    int i = 0; 
    try { 
     while (true) { 
      myString.charAt(i); 
      i++; 
     } 
    } catch (IndexOutOfBoundsException e) { 
     return i; 
    } 
} 

注:這是非常不好的編程習慣和效率非常低。

您可以使用反射來檢查String類中的內部變量,特別是count

+0

缺少'}'並且有錯誤。並且可能不會編譯,因爲編譯器不知道它會始終返回一個值。 – aioobe 2010-05-26 05:56:11

+0

返回我屬於'finally'塊。 – 2010-05-26 06:03:06

+0

@aioobe:很好,謝謝。當您離開評論時,我可能正在糾正錯誤。 – 2010-05-26 06:07:16

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

這是我期待的答案。 – 2012-05-06 05:39:52

3

隱藏長度()的用法:

String s = "foobar"; 

    int i = 0; 
    for(char c: s.toCharArray()) 
    { 
     i++; 
    } 
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 2010-05-26 07:11:43

+6

如果我能趕上你在現實世界中的代碼做這樣的事情,你最終會在thedailywtf.com ;-) – Jesper 2010-05-26 07:59:24

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 
} 
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寫入的字節順序標記。

4

爲半最好的方法已經公佈並沒有什麼更好的那麼字符串長度#...

重定向的System.out到一個FileOutputStream,是System.out.print使用(不println()一樣!),以打印字符串並獲取文件大小 - 這等於字符串長度。測量完成後不要忘記恢復System.out。

;-)

+0

謹防Unicode的問題!將「Größte」寫入UTF-8編碼文件可創建8個字節的文件大小 - 但該字符串只有6個字符長。 – 2015-12-09 09:47:24

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 ; } 
      } 
    } 
} 

我怎麼會忘記一個實際工作在合理的時間? (字符串長度#仍是首選)

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) ; 
} 
8

只是爲了用最笨的方法,我可以想出完成此:生成一個長度爲1的所有可能的字符串,使用等於他們比較原始的字符串;如果它們相等,則字符串長度爲1.如果沒有字符串匹配,則生成所有可能的長度爲2的字符串,比較它們,對於字符串長度爲2.等等繼續,直到找到字符串長度或宇宙結束,無論先發生什麼。

+0

喜歡它 - 絕對是這個愚蠢問題的最佳解決方案。 – user949300 2016-03-09 05:08:54

2

這裏的另一種方式:

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; 
    } 

} 
+0

代碼片段很有用,但應用降價以確保它顯示爲代碼。 – andersoj 2012-04-16 01:14:26

2

我們可以通過像字符數組的字符串迭代,並計算這樣(做的更腳踏實地的方式):

String s = "foo" 
char arr[]=s.toCharArray(); 
int len = 0; 
for(char single : arr){ 
    len++; 
} 

使用「的foreach」版在for循環

3

試試下面的代碼

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

這隻有在原始字符串中不包含''\ 0''字節時纔有效。 – 2013-07-21 16:03:44

相關問題