在csv中并排打印两个数组

时间:2016-12-31 11:00:38

标签: java arrays csv for-loop foreach

我有两个String数组:句子和分数。

我想创建一个.csv文件,其中第一列由句子中的元素组成,第二列由score中的元素组成。

我无法理解代码中的问题所在以及如何修复它。

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 1
sentence 3; score 1

第一列很好,第二列不是。

我想要的输出应该是:

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

我确定某处的循环中存在问题。

如何解决?

2 个答案:

答案 0 :(得分: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 :(得分:1)

@PavneetSingh的答案是解决您问题的短期解决方案,并且会有效。

但更好的方法是将您的设计从2个单独的数组更改为单个数组并与自定义类一起使用。 (这就是为什么我们称Java为面向对象的语言 btw ...)

此解决方案如下所示:

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"));
}