2011-11-26 6 views
1

連結する必要のある古い端末システムからの出力があります。出力の例を次に示します。Javaでの文字列連結

 
output1 = 
LINE ONE 
LINE TWO 
LINE THREE 
NO DATA 
LINE FOUR 
LINE FIVE 
LINE SIX   % 

output2 = 
LINE FOUR  % 
LINE FIVE 
LINE SIX 
LINE SEVEN 
NO DATA 
LINE EIGHT 
END 

結合する必要のある出力文字列は5つまであります。問題...行間に重複が存在する可能性があります(削除する必要のない繰り返し(例:NO DATA)があります)ので、単純な行の比較は実行できません。

 
correct answer should be: 
LINE ONE 
LINE TWO 
LINE THREE 
NO DATA 
LINE FOUR 
LINE FIVE 
LINE SIX 
LINE SEVEN 
NO DATA 
LINE EIGHT 
END

Javaソリューションを探しています。

アイデア?ありがとう。

+1

データをストリームとして、または単一の大きな抽出/ファイルで受け取っていますか? –

+2

あなたが何を求めているか正確には分かりません。どのように弦を持っていますか?なぜすべての文字列をリストに追加できないのですか? –

+0

であり、それは上述のように別々のストリームに入る。 – rob345

答えて

1

ヒント:

使用すると、1つの大きなファイルとしてデータを受信した場合は一覧に

チェック

if (!"NO DATA".equals(thisLine) { 
    if(!list.contains(thisLine)){ /* add to list */} 
}else{ 
    /* add to list */ 
} 
+0

この問題...重複する行(NO DATA)は、「NO DATA」だけでなく、文字列でもかまいません。重複する線が何であるかを予測する方法はありません。 – rob345

+0

あなたはそれについて何かを特定できますか? –

+0

唯一識別できるのは、繰り返す複数の行があることです。上で説明したように、古い端末システムに出力されます。データが画面に対して大きすぎる場合、スクロール・エントリが作成され、残りのデータが提示されます。出力の長さに応じて、最初の出力の最後にいくつかの行が次の行で繰り返されます。 – rob345

1

を作成し、あなたが取ることによって開始する必要があり、出力

の各行を読んでScannerオブジェクトを見てください。

File f = new File("thefile.txt"); 
Scanner s = new Scanner(new BufferedReader(new FileReader(f))).useDelimiter("END"); 
while (s.hasNext()) { 
    String block = s.next(); // string will now contain all text between instances of "END" 
    // process the text block by splitting on \n 
    String[] lines = block.split("\n"); 
    StringBuilder output = new StringBuilder(); 
    for (String line : lines) { 
     // process each line, checking for duplicates, appending to output. 
    } 
    // write your final output to a file, etc. 
} 
+0

を使用すると、正当な同一の行だけでなく、重複?答えは、各行だけでなく、複数の行にまたがってパターンを見ることにあると思います。 – rob345

+0

@ rob345これは素晴らしい方法です。もちろん、必要に応じてスキャナをリダイレクトする必要があります。あなたが話している複数の行のパターンはJasonのコメント '//各行を処理する、... 'です。必要なプロトコルロジックを置くことができます。 – corsiKa

+0

私はこの.. ..ありがとう。 – rob345