1

入力ファイルの例:

ARTIST="unknown"
TITLE="Rockabye Baby"
LYRICS="Rockabye baby in the treetops
When the wind blows your cradle will rock
When the bow breaks your cradle will fall
Down will come baby cradle and all
"

アーティスト、タイトル、歌詞のフィールドは、キャプタライズとフォーマットを変更せずに、それぞれの文字列に抽出する必要があります。アーティスト フィールドのこのコード

while (readIn.hasNext()) {
    readToken= readIn.next();
    if (readToken.contains("ARTIST")) {
        artist= readIn.next();
        }
        if (readToken.contains("TITLE")){
            title= readIn.next();
    System.out.print(artist+" "+title);
}

これを印刷することになります:

"unknown"
TITLE null"unknown"
TITLE null"unknown"
TITLE

コードから、出力がこのように印刷される理由がわかりません。ループを通過するたびに、readToken 文字列が更新され、contains() メソッドによって比較される必要があります。明らかに、ここで何かが欠けています。

それで、私は正しい道に近づいていますか、それともまったく別の都市にいますか?

4

3 に答える 3

3

あなたのコードから

while (readIn.hasNext()) {
    readToken= readIn.next();
    if (readToken.contains("ARTIST")) {
        artist= readIn.next();
        }
    if (readToken.contains("TITLE")){
        title= readIn.next();
    System.out.print(artist+" "+title);
}

プログラムが正しく宣言され、インスタンス化されている場合 (変数 artist、readToken、および title) は、while 条件に既存の次の行が存在するかどうかを最初にチェックします。次の行。readToken に「ARTIST」が含まれている場合、次の行がアーティスト文字列として保存されます。「TITLE」を含む場合も同様です。while ループが繰り返される頃には、すでに LYRICS にヒットし、TITLE を完全にスキップして NULL になっている可能性があります。

あなたが望むのはおそらく保存です

アーティスト = readToken; またはタイトル = readToken; 代わりは。

また、"ARTIST="ARTISTNAMEHERER" TITLE="TITLENAMEHERE"" ではなく "ARTISTNAME, TITLENAME" のプリントが必要な場合は、サブストリング アーティストとタイトルを忘れないでください。

于 2010-09-13T05:38:23.587 に答える
2

Alex Hartの答えに加えて、JavaのPatternクラスとMatcherクラスを使用し、グループを使用して一致する引数を取得することを検討してください(テストされていません)。

private static final Pattern RECORDING_HEADER = 
  new Pattern("(ARTIST=\\"(.*)\\")?(TITLE=\\"(.*)\\")?(LYRICS=\\"(.*)\\")?");

次に、行を読んでいるとき:

String line = readIn.readLine(); // Presuming that readIn is a BufferedReader
Matcher m = RECORDING_HEADER.matcher(line);

if (m.matches()) {
  final int artistGroup = 2;
  String artist = m.group(artistGroup);

  final int titleGroup = 4;
  String title = m.group(titleGroup);

  final int lyricsGroup = 6;
  String lyrics = m.group(lyricsGroup);

  if (artist != null) {
    // You've got an artist...
  } else if (title != null) {
    // etc...
  }
}
于 2010-09-13T03:24:48.170 に答える
1

ここで行っていることは、行ごとに読み取っているように見えますが、探しているものが見つかったら、変数を次の行に設定しています。これは問題や範囲外の問題を引き起こしている可能性があり、事故の兆候である可能性が非常に高い

于 2010-09-13T03:01:33.830 に答える