Длина Строки, не используя длину () [закрытый] метод

9
задан 5377037 5 January 2018 в 19:34
поделиться

11 ответов

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

41
ответ дан 4 December 2019 в 05:50
поделиться

Поскольку никто еще не выложил непослушный способ с черного хода:

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

;)

19
ответ дан 4 December 2019 в 05:50
поделиться

Вот другой способ:

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
ответ дан 4 December 2019 в 05:50
поделиться

Просто для полноты (и это совсем не рекомендуется):

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.

2
ответ дан 4 December 2019 в 05:50
поделиться

Еще более медленный

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
ответ дан 4 December 2019 в 05:50
поделиться

Просто дополним это самым глупым методом, который я могу придумать: Сгенерируйте все возможные строки длины 1, используйте equals для сравнения их с исходной строкой; если они равны, длина строки равна 1. Если ни одна строка не совпадает, сгенерируйте все возможные строки длины 2, сравните их, для длины строки 2. И так далее. Продолжайте, пока не найдете длину строки или пока не закончится вселенная, в зависимости от того, что произойдет раньше.

8
ответ дан 4 December 2019 в 05:50
поделиться

Использование скрытой длины ():

    String s = "foobar";

    int i = 0;
    for(char c: s.toCharArray())
    {
        i++;
    }
3
ответ дан 4 December 2019 в 05:50
поделиться

Ибо полулучшие методы уже выложены, и нет ничего лучше String#length...

Перенаправьте System.out в FileOutputStream, используйте System.out.print (не println()!) для печати строки и получите размер файла - он равен длине строки. Не забудьте восстановить System.out после измерения.

;-)

4
ответ дан 4 December 2019 в 05:50
поделиться
String blah = "HellO";
int count = 0;
for (char c : blah.toCharArray()) {
    count++;
}
System.out.println("blah's length: " + count);
22
ответ дан 4 December 2019 в 05:50
поделиться

Очень хорошие решения. Вот еще несколько.

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 ) ;
}
1
ответ дан 4 December 2019 в 05:50
поделиться

Вы можете использовать цикл для проверки каждой позиции символа и поймать IndexOutOfBoundsException, когда вы передадите последний символ. Но зачем?

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

Примечание: Это очень плохая практика программирования и очень неэффективная.

Вы можете использовать отражение для изучения внутренних переменных класса String, в частности count.

11
ответ дан 4 December 2019 в 05:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: