Java - реверсирование слов в строке - PullRequest
1 голос
/ 24 октября 2011

Это наш код:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class reverse {

public static void main(String[] args) throws FileNotFoundException {
    File fil = new File("textFile.txt");
    Scanner scan = new Scanner(fil);

    while (scan.hasNext()) {
        String in = scan.nextLine();
        in = new StringBuffer(in).reverse().toString();
        Pattern replace = Pattern.compile("\\W+");
        Matcher matcher = replace.matcher(in);
        System.out.println(matcher.replaceAll("\t"));
        }



    }

}

В нашем textFile.txt есть буквы, цифры и слова в разных строках. Мы хотим распечатать их в обратном порядке. Так что, если одна строка: Да, 4 Шоколадное молоко. Мы хотим распечатать: молочный шоколад 4 Да.

Наш код печатает слова в обратном порядке, поэтому yes становится sey. Мы не хотим, чтобы это было так, но не знаем, как это изменить. Мы думали о создании стека, но не понимаем, как он будет работать вместе с паттернами Pattern и Matcher.

Ответы [ 3 ]

4 голосов
/ 24 октября 2011

Вы не должны переворачивать прочитанную строку, а разбивать ее на коллекцию и переворачивать ее.То, что вы делаете, это поменяйте местами символы, и вы получите следующее:

Yes, 4 Chocolate milk -> klim etalocohC 4 , seY

Если вы разделите строку на ["Yes","4","Chocolate milk"], вы можете перевернуть этот массив / список.

Проблема заключается в следующем: Iдумаю, вы хотите сохранить Chocolate milk в таком порядке, поэтому вам нужно определить, какие слова принадлежат друг другу.Если вы всегда вводите <words>, <number> <words>, вы можете сначала разделить на ,, чтобы разделить первый <words>, а затем на первый пробел для остатка, чтобы разделить число и второй <words>.

Обновление : попробуйте это:

String input = "Yes sir, 4 Chocolate milk";

//Pattern is: 
//- one or more words separated by whitespace as group 1: ((?:\\w+\\s*)+)
//- a comma 
//- optional whitespace: \\s*
//- an integer number as group 2: (\\d+)
//- optional whitespace \\s*
//- an arbitrary rest (which might contain anything) as group 3: (.*)
Pattern p = Pattern.compile( "((?:\\w+\\s*)+),\\s*(\\d+)\\s*(.*)" );
Matcher m = p.matcher( input );

List<String> list = new ArrayList<String>();
while(m.find()) {
  list.add( m.group( 1 ) );
  list.add( m.group( 2 ) );
  list.add( m.group( 3 ) );
}

Collections.reverse( list );
for( String s : list) {
  System.out.println(s);
}

Вывод должен быть

Chocolate milk
4
Yes sir

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

1 голос
/ 24 октября 2011

Попробуйте использовать Scanner или просто String.split() для создания Array или Collection всех токенов в вашей линии.Затем просто используйте for -loop, чтобы перебрать его в обратном направлении, чтобы воссоздать строку.Вы также можете использовать Collections.reverse() для достижения этой цели.

0 голосов
/ 24 октября 2011

Разделите строку по словам, сохраните результат в массив строк и затем отобразите строку от последнего к первому элементу. Код:

public static void main(String[] args) {
    String hello = "bananas 45 guns me likes 3";
    String[] reverse_me = hello.split(" ");

    // the -1 is because the index starts in zero :-0)
    for(int i = reverse_me.length-1; i >= 0 ; i--){
        System.out.println(reverse_me[i]);
    }

}

Выход:

3
likes
me
guns
45
bananas
...