2016-12-31 18 views
2

2つのString配列があります:文とスコア。csvと並んで2つの配列を並べて表示する

最初の列が文の要素で構成され、2番目の列がスコアの要素で構成された.csvファイルを作成したいとします。

私のコードのどこに問題があるのか​​、それを修正する方法がわかりません。最初の列は第二のではなく、微細で

sentence; score 
sentence 1; score 1 
sentence 2; score 1 
sentence 3; score 1 

import java.io.File; 
import java.io.PrintWriter; 

public class GeneraCsv { 
    public static void main(String[] args) throws Exception { 
     String[] sentence = {"sentence 1", "sentence 2", "sentence 3"}; 
     String[] score = {"score 1", "score", "score 3"}; 
     PrintWriter pw = new PrintWriter(new File("C:/Users/Gonzalo/Desktop/test.csv")); 
     StringBuilder sb = new StringBuilder(); 
     sb.append("sentence"); 
     sb.append(';'); 
     sb.append("score"); 
     sb.append('\n'); 
     for(String a: sentence) { 
      sb.append(a); 
      sb.append(";"); 
      for(String b: score) { 
       sb.append(b); 
       sb.append('\n'); 
       break; 
      } 
     } 
     pw.write(sb.toString()); 
     pw.close(); 
     System.out.println("done!"); 
    } 
} 

私のコードは、これを生成します。

私が欲しいの出力は次のようにする必要があります:私はどこかのループに問題があると確信している

sentence; score 
sentence 1; score 1 
sentence 2; score 2 
sentence 3; score 3 

修正方法?

+1

。スコア2 'を出力した場合、初期値を変更する必要があります。なぜなら、「スコア2」ではなく「スコア」しかないからです。 –

+0

@RO_engineerはタイプミスのようですが、スコア1、スコア2、スコア3、そしてNoobNw0でスコアと文章を印刷したいと思っています。 way –

+0

@RO_engineer nice eyes here –

答えて

3

問題

常に

for(String a: sentence) { 
      sb.append(a); // this will iterate the sentence array in sequential order 
      sb.append(";"); 

      for(String b: score) { 
       // this will always pick score 1 because there will be only one iteration due to break 
       sb.append(b); 
       sb.append('\n'); 
       break; // stop the loop after first iteration 
      } 
     } 

がので、これは

1)インデックス

を使用して配列の長さに応じて配列を反復使用インナーループ内スコアの最初の入力を使用しています2.)インデックスを使用してデータにアクセスし、追加します。StringBuilder

for(int i=0;i <score.length;i++) { 

     sb.append(sentence[i]); 
     sb.append(";"); 

     sb.append(score[i]); 
     sb.append('\n');     
     //System.out.print(sb.toString()); to print values 
     //sb =new StringBuilder(); 
    } 
    pw.write(sb.toString()); 
    pw.close(); 

注:このシングルループとループの両方を交換し

出力:

sentence 1;score 1  
sentence 2;score  
sentence 3;score 3 
+1

ありがとう! – NoobNe0

+0

@ NoobNe0私は喜んでいる、私は、幸せなコーディングを助けることができた –

1

@PavneetSinghの回答は、あなたの問題への短期的な解決策であると動作します。

しかし、より良いアプローチは、カスタムクラスと組み合わせて2つの別々の配列から1つの配列にデザインを変更することです。このソリューションは、次のようになります

(私達はところでオブジェクト指向言語のJavaを呼び出す理由は...です):あなたは `文2を持つようにしたい場合は

class SentenceScore{ 
    private final Sting sentence; 
    private final int score; 
    SentenceScore(Sting sentence, int score){ 
    this.sentence = sentence; 
    this.score = score; 
    } 

    @Override 
    public String toString(){ 
    return "sentence: "+sentence+"; score: "+score; 
    } 
} 

for(SentenceScore sentenceScore : sentenceScores){ 
    sb.append(a); 
    sb.append(System.getProperty("line.separator")); 
} 
+0

これはまた、メソッドのオーバーライドのいくつかの使用でも面白いです。私はすぐにそれを与えるだろう – NoobNe0

関連する問題