Java - 反转字符串中的单词

时间:2011-10-24 12:47:02

标签: java design-patterns reverse matcher

这是我们的代码:

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是的。

我们的代码打印出相反的单词,所以是的,变成了sey。我们不希望它像这样,但不知道如何改变它。我们一直在考虑创建一个堆栈,但我们不知道它如何与Pattern和Matcher一起工作。

3 个答案:

答案 0 :(得分:4)

您不应该反转您阅读的行,而是将该行拆分为一个集合并将其反转。 你所做的就是扭转角色,所以你得到了这个:

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

如果将行拆分为["Yes","4","Chocolate milk"],则可以反转该数组/列表。

问题是:我想你想按顺序保留Chocolate milk,所以你需要定义哪些单词属于一起。如果您的输入始终为<words>, <number> <words>,则可以首先分割,,分隔第一个<words>,然后分隔剩余部分的第一个空格,以便分割数字和第二个{{ 1}}。

更新:试试这个:

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

请注意,这取决于输入的布局,只是为了提供一个开始。您还需要将其与其他模式匹配逻辑集成。

答案 1 :(得分:1)

尝试使用Scanner或仅String.split()来创建行内所有令牌的ArrayCollection。然后只需使用for - 循环向后迭代它以重新创建该行。您也可以使用Collections.reverse()来实现此目的。

答案 2 :(得分:0)

按字分割字符串,将结果保存到字符串数组中,然后显示从最后一个元素到第一个元素的字符串。 代码:

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