1

这是我们的代码:

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 的情况下协同工作。

4

3 回答 3

4

您不应该反转您阅读的行,而是将该行拆分为一个集合并反转它。你所做的是颠倒字符,所以你得到这个:

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

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

问题是:我猜你想保持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

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

于 2011-10-24T12:51:43.377 回答
1

尝试使用Scanneror 简单地在您的行String.split()中创建一个ArrayCollection所有令牌。然后只需使用for-loop 向后迭代它以重新创建该行。您也可以使用Collections.reverse()来实现这一点。

于 2011-10-24T12:51:05.370 回答
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
于 2011-10-24T13:04:34.650 回答