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()
? :-)
Поскольку никто еще не выложил непослушный способ с черного хода:
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);
}
;)
Вот другой способ:
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;
}
Просто для полноты (и это совсем не рекомендуется):
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.
Еще более медленный
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
}
Просто дополним это самым глупым методом, который я могу придумать: Сгенерируйте все возможные строки длины 1, используйте equals для сравнения их с исходной строкой; если они равны, длина строки равна 1. Если ни одна строка не совпадает, сгенерируйте все возможные строки длины 2, сравните их, для длины строки 2. И так далее. Продолжайте, пока не найдете длину строки или пока не закончится вселенная, в зависимости от того, что произойдет раньше.
Использование скрытой длины ():
String s = "foobar";
int i = 0;
for(char c: s.toCharArray())
{
i++;
}
Ибо полулучшие методы уже выложены, и нет ничего лучше String#length...
Перенаправьте System.out в FileOutputStream, используйте System.out.print (не println()!) для печати строки и получите размер файла - он равен длине строки. Не забудьте восстановить System.out после измерения.
;-)
String blah = "HellO";
int count = 0;
for (char c : blah.toCharArray()) {
count++;
}
System.out.println("blah's length: " + count);
Очень хорошие решения. Вот еще несколько.
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 ; }
}
}
}
Как я мог забыть то, что действительно работает за разумное время? (String#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 ) ;
}
Вы можете использовать цикл для проверки каждой позиции символа и поймать IndexOutOfBoundsException
, когда вы передадите последний символ. Но зачем?
public int slowLength(String myString) {
int i = 0;
try {
while (true) {
myString.charAt(i);
i++;
}
} catch (IndexOutOfBoundsException e) {
return i;
}
}
Примечание: Это очень плохая практика программирования и очень неэффективная.
Вы можете использовать отражение для изучения внутренних переменных класса String
, в частности count
.