Как перевернуть два слова в предложении в Java - PullRequest
2 голосов
/ 09 мая 2019

Как перевернуть два слова в предложении в java, например

Входные данные: «Привет, как дела, сегодня, Джейн»

Вывод: «Привет, как дела сегодня, Джейн?»

что я пробовал:

String s = "hi how are you doing today jane";
    ArrayList<String> al = new ArrayList<>();

    String[] splitted = s.split("\\s+");
    int n = splitted.length;
    for(int i=0; i<n; i++) {
        al.add(splitted[i]);
    }
  for(int i=0; i<n-1; i=i+2) {
    System.out.print(al.get(i+1)+" "+al.get(i)+" ");
  }
  if((n%2) != 0) {
          System.out.print(al.get(n - 1));
      }

вывод я получаю: "как дела сегодня"

Ответы [ 3 ]

2 голосов
/ 09 мая 2019

Как вы просили сделать только с одним циклом и без интенсивного использования регулярных выражений, вот еще одно решение, использующее Collections.swap:

String s = "hi how are you doing today jane";
List<String> splitted = new ArrayList<>(List.of(s.split("\\s+")));

for(int i = 0; i < splitted.size() - 1; i += 2)
    Collections.swap(splitted, i, i + 1);
s = String.join(" ", splitted);
System.out.println(s);

Выход:

как ты сегодня занимаешься Джейн

1 голос
/ 09 мая 2019

Поскольку вы используете split(), который принимает регулярное выражение, может показаться, что использование регулярного выражения является допустимым решением, поэтому используйте его:

replaceAll("(\\w+)(\\W+)(\\w+)", "$3$2$1")

Объяснение

(\\w+)   Match first word, and capture it as group 1
(\\W+)   Match the characters between the 2 words, and capture them as group 2
(\\w+)   Match second word, and capture it as group 3
$3$2$1   Replace the above with the 3 groups in reverse order

Пример

System.out.println("hi how are you doing today jane".replaceAll("(\\w+)(\\W+)(\\w+)", "$3$2$1"));

Вывод

how hi you are today doing jane

Примечание. Поскольку ваш код используется split("\\s+"), ваше определениеслова - это последовательность непробельных символов.Чтобы использовать это определение слова, измените регулярное выражение на:

replaceAll("(\\S+)(\\s+)(\\S+)", "$3$2$1")
0 голосов
/ 09 мая 2019

Если вам нужно старое школьное решение для fori loop и значение bufor / temp, вот вам:

public static void main(String[] args) {
    String s = "hi how are you doing today jane";
    String flip = flip(s);
    System.out.println(flip);
}

private static String flip(String sentence) {

    List<String> words = Arrays.asList(sentence.split("\\s+"));

    for (int i = 0; i < words.size(); i += 2) {
        if (i + 1 < words.size()) {
            String tmp = words.get(i + 1);
            words.set(i + 1, words.get(i));
            words.set(i, tmp);
        }
    }
    return words.stream().map(String::toString).collect(Collectors.joining(" "));
}

Однако Раствор Паулса намного лучше, так как это Java, и мыбольше не в эпоху каменного века:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...