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には、さまざまな行に文字、数字、単語があります。逆の順序で印刷したい。したがって、1行が次の場合:はい、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>、次に残りの最初の空白で分割して、数値と 2 番目の<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

orを使用して、ライン内のすべてのトークンのScannerorString.split()を作成してみてください。次に、ループを使用して逆方向に反復し、行を再作成します。これを達成するために使用することもできます。ArrayCollectionforCollections.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 に答える