Java - 反转字符串中的单词

标签 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 巧克力牛奶。我们要打印出来: milk Chocolate 4 是的。

我们的代码以相反的方式打印单词,所以 yes 变成了 sey。我们不希望它变成这样,但不知道如何改变它。我们一直在考虑创建一个堆栈,但我们不知道它如何在没有 Pattern 和 Matcher 的情况下一起工作。

最佳答案

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

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

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

关于Java - 反转字符串中的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7875850/

相关文章:

java - 使用 HtmlUnit WebClient 为每个请求传递基本身份验证凭据

c++ - boost::dynamic_bitset 的逆序

python - 反转附加列表或前置列表是否更便宜? - Python

java - Struts 2 jQuery Datepicker 格式问题

java - Android WebView 在 Android 4.2.2 上无法加载 url

java - 复合设计模式和空覆盖

Java - 服务提供者的实现

python - 倒着写字

java - 检查java中没有时间的日期范围并使用jodatime

c# - 如何在 ASP MVC 中实现工作单元、存储库和业务逻辑?