Как перевернуть два слова в строке, Java

Итак, скажем, у меня есть строка с именем x, которая = «Hello world». Я хочу как-то сделать так, чтобы эти два слова переворачивались и вместо этого отображалось «world Hello». Я не очень хорошо разбираюсь в циклах или массивах и, очевидно, новичок. Могу ли я как-то добиться этого, разделив мою строку? Если да, то как? Если нет, то как я мог это сделать? Помощь приветствуется, спасибо!


person Lanuk Hahs    schedule 10.01.2012    source источник


Ответы (7)


1) разбить строку на массив String в пространстве.

String myArray[] = x.split(" ");

2) Создать новую строку со словами в обратном порядке от массива.

String newString = myArray[1] + " " + myArray[0];

Бонусные баллы за использование StringBuilder вместо конкатенации.

person Brian Roach    schedule 10.01.2012
comment
Использовать StringBuilder для двух слов? Java сделает это сама. Преждевременная оптимизация? - person Maarten Bodewes; 11.01.2012
comment
@owlstead — расшириться; хотя приведенное выше не гарантирует использование StringBuilder, полезно знать об этом и о подводных камнях использования конкатенации строк в java. Учитывая очевидный начальный уровень ОП, было бы неплохо, если бы он научился раньше, прежде чем он укусит его;) - person Brian Roach; 11.01.2012
comment
@BrianRoach - Если вы собираетесь преподать урок, это должен быть правильный урок. В большинстве случаев плохая практика использовать StringBuilder вместо +. - person Stephen C; 11.01.2012
comment
@StephenC - насколько мне известно, компилятор делает это за вас там, где может, и Джош Блох довольно ясно изложил это в своей книге. Что изменилось? Я рад покаяться :) - person Brian Roach; 11.01.2012
comment
@BrianRoach Использовал для этого построитель строк: System.out.println(reverseWords("Owlstead is 01 very \"strange bïrd\"!")); чтобы получить !"bïrd strange" very 01 is owlsteaD - person Maarten Bodewes; 11.01.2012
comment
@BrianRoach - я полностью осознаю, что компилятор использует StringBuilder в этом контексте. В вашем предложении Бонусные баллы за использование StringBuilder вместо конкатенации говорится, что программист должен использовать StringBuilder в этом контексте. (Мы не начисляем баллы компилятору...) Я говорю, что это неправильный урок. (Если вы не понимаете, почему программисту неправильно использовать StringBuilder, скажите мне, и я объясню.) - person Stephen C; 11.01.2012
comment
@BrianRoach - Причина, по которой я ругаю вас за это, заключается в том, что я часто вижу код, в котором кто-то допустил ошибку, переписав простое выражение конкатенации с помощью StringBuilder ... потому что кто-то другой сказал, что это правильно. Нет, это не так. - person Stephen C; 11.01.2012

String abc = "Hello world";
String cba = abc.replace( "Hello world", "world Hello" );

abc = "This is a longer string. Hello world. My String";
cba = abc.replace( "Hello world", "world Hello" );

Если хотите, вы также можете взорвать свою строку:

String[] pieces = abc.split(" ");
for( int i=0; i<pieces.length-1; ++i )
    if( pieces[i]=="Hello" && pieces[i+1]=="world" ) swap(pieces[i], pieces[i+1]);

Есть много других способов сделать это. Будьте осторожны с заглавными буквами. Вы можете использовать .toUpperCase() в своих операторах if, а затем сделать соответствующие условные операторы прописными, но оставить результаты с их исходной заглавной буквой и т. д.

person Authman Apatira    schedule 10.01.2012
comment
Почему-то я не думаю, что Ланук искал ответ, который просто заменяет два слова другой строкой. - person Maarten Bodewes; 11.01.2012
comment
привет мир это просто например. пример нельзя использовать для других строк - person Aravind Yarram; 11.01.2012
comment
Я полагаю, вы видели остальную часть моего поста с заявлением о взрыве @ owlstead? - person Authman Apatira; 11.01.2012

Вот решение:

import java.util.*;

public class ReverseWords {
    public String reverseWords(String phrase) {
        List<String> wordList = Arrays.asList(phrase.split("[ ]"));
        Collections.reverse(wordList);

        StringBuilder sbReverseString = new StringBuilder();
        for(String word: wordList) {
            sbReverseString.append(word + " ");
        }

        return sbReverseString.substring(0, sbReverseString.length() - 1);
    }
}

Приведенное выше решение было написано мной для Google Code Jam, а также опубликовано здесь: Обратные слова — GCJ 2010

person bchetty    schedule 10.01.2012

Просто используйте этот метод, вызовите его и передайте строку, которую вы хотите разделить

static String reverseWords(String str) {

    // Specifying the pattern to be searched
    Pattern pattern = Pattern.compile("\\s");

    // splitting String str with a pattern
    // (i.e )splitting the string whenever their
    //  is whitespace and store in temp array.
    String[] temp = pattern.split(str);
    String result = "";

    // Iterate over the temp array and store
    // the string in reverse order.
    for (int i = 0; i < temp.length; i++) {
        if (i == temp.length - 1) {
            result = temp[i] + result;
        } else {
            result = " " + temp[i] + result;
        }
    }
    return result;
}
person Sosko    schedule 31.05.2020

В зависимости от ваших точных требований вы можете разделить другие формы пробелов (табуляции, несколько пробелов и т. д.):

static Pattern p = Pattern.compile("(\\S+)(\\s+)(\\S+)");
public String flipWords(String in)
{
    Matcher m = p.matcher(in);
    if (m.matches()) {
        // reverse the groups we found
        return m.group(3) + m.group(2) + m.group(1);
    } else {
        return in;
    }
}

Если вы хотите получить более сложную информацию, см. документацию по шаблону http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

person clucas    schedule 10.01.2012

Попробуйте следующее:

String input = "how is this";
List<String> words = Arrays.asList(input.split(" "));
Collections.reverse(words);
String result = "";
for(String word : words) {
    if(!result.isEmpty()) {
        result += " ";
    }
    result += word;
}
System.out.println(result);

Вывод:

this is how
person Bhesh Gurung    schedule 11.01.2012

Слишком много?

private static final Pattern WORD = Pattern.compile("^(\\p{L}+)");
private static final Pattern NUMBER = Pattern.compile("^(\\p{N}+)");
private static final Pattern SPACE = Pattern.compile("^(\\p{Z}+)");

public static String reverseWords(final String text) {
    final StringBuilder sb = new StringBuilder(text.length());

    final Matcher wordMatcher = WORD.matcher(text);
    final Matcher numberMatcher = NUMBER.matcher(text);
    final Matcher spaceMatcher = SPACE.matcher(text);

    int offset = 0;
    while (offset < text.length()) {

        wordMatcher.region(offset, text.length());
        numberMatcher.region(offset, text.length());
        spaceMatcher.region(offset, text.length());

        if (wordMatcher.find()) {
            final String word = wordMatcher.group();
            sb.insert(0, reverseCamelCase(word));
            offset = wordMatcher.end();
        } else if (numberMatcher.find()) {
            sb.insert(0, numberMatcher.group());
            offset = numberMatcher.end();
        } else if (spaceMatcher.find()) {
            sb.insert(0, spaceMatcher.group(0));
            offset = spaceMatcher.end();
        } else {
            sb.insert(0, text.charAt(offset++));
        }
    }

    return sb.toString();
}

private static final Pattern CASE_REVERSAL = Pattern
        .compile("(\\p{Lu})(\\p{Ll}*)(\\p{Ll})$");

private static String reverseCamelCase(final String word) {
    final StringBuilder sb = new StringBuilder(word.length());
    final Matcher caseReversalMatcher = CASE_REVERSAL.matcher(word);
    int wordEndOffset = word.length();
    while (wordEndOffset > 0 && caseReversalMatcher.find()) {
        sb.insert(0, caseReversalMatcher.group(3).toUpperCase());
        sb.insert(0, caseReversalMatcher.group(2));
        sb.insert(0, caseReversalMatcher.group(1).toLowerCase());
        wordEndOffset = caseReversalMatcher.start();
        caseReversalMatcher.region(0, wordEndOffset);
    }
    sb.insert(0, word.substring(0, wordEndOffset));
    return sb.toString();
}
person Maarten Bodewes    schedule 11.01.2012