2014-02-05 4 views
1

Я пытаюсь выполнить простую обратную задачу: изменить строку «как вы» на «вы как».Ошибка при попытке изменить строку в Java

это мой код:

public class Program { 
    public static String revSentence (String str) { 
     String [] givenString = str.split(" "); 
     String [] retString = new String[givenString.length]; 

     int last = givenString.length - 1; 

     for (int i = 0; i < givenString.length; i++) { 
      retString [i] = givenString[last--]; 
     } 

     return retString.toString(); 
    } 

    public static void main(String[] args) { 
     String m = "how are you"; 
     System.out.println(revSentence(m)); 
    } 
} 

Я получаю странный вывод:

[Ljava.lang.String;@e76cbf7 
+1

Вызов 'ToString()' на массиве не даст вам ничего полезного. Вы хотите 'StringBuilder'. – SLaks

ответ

2

Вот решение:

public class Program { 
    public static String revSentence (String str) { 
     String retString = ""; 
     String [] givenString = str.split(" "); 

     for (int i=givenString.length-1; i>=0; i--) { 
      retString += givenString[i] + " "; 
     } 
     return retString; 
    } 


    public static void main(String[] args) { 
     String m = "how are you"; 
     System.out.print(revSentence(m)); 
    } 

} 

Modified это сделать функцию «revSentence» возвращает строку, а также улучшили код немного. Наслаждайтесь!

+0

Это отличное решение, но в задаче мне нужно вернуть строку ..:? – JohnBigs

+0

Вам не хватает символа новой строки, в котором требуется разметка между блоком кода и первым предложением. –

+0

@JohnBigs, я изменил свой код. Это ты имел в виду? Чтобы функция «revSentence» просто возвращала строку, а не массив строк? –

1

Calling toString() на объект массива (в вашем случае retString) не печатает все элементы массива , вместо этого он печатает адрес объекта.

Вы должны печатать записи массива, итерации по ним.

+0

вначале, когда я просто попытался вернуть retString, я получил сообщение об ошибке, что я могу преобразовать строку [] в строку ... так как я могу просто вернуть строку там и использовать syso для ее распечатки в главном? потому что мы только узнали некоторые основы, мы не дошли до строкового построителя. @ Juvanis – JohnBigs

+0

Мои ответы включают в себя arrayToString и все вспять все-в-одном (в зависимости от того, что вы предпочитаете), с и без strinbuiolder, так что у вас есть сравнение там, на чем (примерно) 'StringBuilder'. –

4

Вывод не является «странным» вообще - это внутреннее строковое представление объекта, созданное Object.toString(). String[] не переопределяет это. Если вы хотите вывести все entires, проведите через них и соедините их, лучше используйте StringBuilder, чтобы избежать создания ненужных экземпляров String.

public static String arrayToString (String[] array) { 
    StringBuilder result = new StringBuilder(); 
    for (String value : array) { 
     result.append(value); 
    } 
    return StringBuilder.toString(); 
} 

Если вам не нужен этот метод на своем собственном и хотят включить его в общем процессе реверсирования предложения, это то, как это может выглядеть. Он выполняет итерацию только один раз, итерации назад (= подсчет), чтобы отменить предложение.

public static String revSentence (String str) { 
    String []  givenString = str.split(" "); 
    StringBuilder result  = new StringBuilder(); 

    // no need for 'last', we can use i to count down as well... 
    for (int i = givenString.length - 1 ; i >= 0; i--) { 
     result.append(givenString[i]); 
    } 
    return result.toString(); 
} 

[Изменить]: из ППО комментарии к одному из других ответов, о том, не научившись использовать StringBUilder еще, вот метод arrayToStirng без использования одного. Обратите внимание, что это не должно делаться обычно, так как оно создает бесполезные экземпляры String, которые не очищаются GC из-за непреложного характера String (все экземпляры хранятся для повторного использования).

public static String arrayToString (String[] array) { 
    String result = ""; 
    for (String value : array) { 
     result += value; 
    } 
    return result; 
} 

Или без метода посвящаю arrayToString:

public static String revSentence (String str) { 
    String []  givenString = str.split(" "); 
    String  result  = ""; 

    for (int i = givenString.length-1 ; i >= 0 ; i--) { 
     result += givenString[i]; 
    } 
    return result; 
} 
+0

Отличный ответ @Johannes, но не StringBuilder немного перехитрил для чего пользователь хочет выполнить? Поскольку используется цикл for, я не знаю, есть ли здесь преимущество в скорости? –

+0

@AlvinBunk Не обязательно скорость, но все же производительность. Поскольку 'String' является ** неизменным **, добавление двух строк всегда создает новый экземпляр. Старые экземпляры хранятся внутри для повторного использования с помощью 'String', так что дополнительные экземпляры не должны создаваться, если одна и та же строка используется снова (что отлично подходит для больших программ, но вряд ли они нам понадобятся здесь снова). Это предотвращает очистку GC. Использование Stringbuilder (который хранит 'char' в каком-то массиве или списке внутри) обходит это, не добавляя слишком много служебных данных (возможно изменение размера внутреннего массива). –

+0

Мы могли бы повысить производительность еще больше, если бы мы не разделили строку (и не создавали новые экземпляры строк для каждого слова), но читали ее char по символу, сохраняли символы в списке и запускали новый список каждый раз, когда мы достигаем пробелов , Но ЭТО я бы подумал о переполнении;) –

1

Используйте этот код для обратной строки

StringBuilder builder = new StringBuilder(); 
for(String s : retString) { 
    builder.append(s); 
} 
return builder.toString(); 
+0

StringBuilder имеет функцию 'reverse'on its own ... :) –

+1

, что обратное - это что-то другое. «Hello World» to «olleH dlroW», где он хочет «World Hello» – Wajahat

+0

Oh! хорошо ... yepp. Не понял. Редактируя мой ответ, спасибо, спасибо! –

0

Вызов ToString на массиве дает реф памяти, которая не очень полезно. Попробуйте это:

public static String revSentence (String str) { 
    String[] givenString = str.split(" "); 

    StringBuilder sb = new StringBuilder(); 
    for (int i = givenString.length - 1; i >= 0; i--) { 
     sb.append(givenString[i]); 
     if (i != 0) 
      sb.append(" "); 
    } 
    return sb.toString(); 
} 
-1

быстрее и короче: Чтобы изменить слово, используйте:

public String reverseWord(String s) { 
    StringBuilder y = new StringBuilder(s); 
    return y.reverse(); 
} 

Теперь раскол и использовать этот метод и использовать Stringbuidler.append для сростить все. И не забывайте пространство между ними.

+0

Нет, не то, что хочет операционная система - сделала ту же ошибку. Это отменяет всю строку, но только слова должны меняться, но сохраняться в правильном порядке внутри. –

+1

@JohannesH. yes updated – AlexWien

+0

Обратный, отменяет символы, что не является желательным ... –

0

начало for цикла от большей длины, чтобы снизить и builder.append(givenString[i] + " "); это сцепить строки и вернуть целое предложение вы как вы можете использовать как mySentence += givenString[i] + " "; или builder.append(givenString[i] + " "); но лучший способ заключается в использовании StringBuilder класса (см docs)

public class Program { 
public static String revSentence(String str) { 
    String[] givenString = str.split(" "); 
    String[] retString = new String[givenString.length]; 

    int last = givenString.length - 1; 
    //String mySentence = ""; 

    StringBuilder builder = new StringBuilder(); 

    for (int i = givenString.length - 1; i >= 0; i--) { 
     // retString [i] = givenString[i]; 
     // mySentence += givenString[i] + " "; 
     builder.append(givenString[i] + " "); 
    } 

    return builder.toString(); // retuning String 
      //return mySentence; 
} 

public static void main(String[] args) { 
    String m = "how are you"; 
    System.out.println(revSentence(m)); 
} 

}

+3

Это нехорошее решение, так как цикл для конкатенации создает новую строку на каждой итерации (String в JAVA непреложна). Для этого используйте StringBuilder. – Wajahat

+0

Это особенно плохо, поскольку 'String'sntances хранятся внутри класса' String' для последующего повторного использования (из-за неизменного характера 'String' это обычно повышает производительность, если вы избегаете создания ненужных экземпляров), поэтому сборщик мусора не может даже удалите их. –

+0

спасибо за информацию, я сделал некоторые изменения в своем ответе –

Смежные вопросы