汇总函数未对.csv数据进行完全排序

vxbzzdmp  于 2023-02-14  发布在  其他
关注(0)|答案(2)|浏览(109)

我有一个.csv文件,其中包含如下所示的数据:名字姓氏首字母,1/0,1/0,....
它是1或0,取决于人们从包含50对选项的txt文件中的选择。
我的问题是,我的方法(classSummary)计数有多少人选择了选项,但只进行了一半,计数是不正确的。
下面是我的代码,任何建议都将不胜感激:

public static void classSummary() {
    for (Student student : data) {
        int[] answers = student.getAnswers();
        for (int i = 0; i < answers.length; i++) {
            if (answers[i] == 0) {
                choices.get(i).setCount(choices.get(i).getCount() + 1);
            }
fnatzsnv

fnatzsnv1#

您的方法中存在两个问题:
1.您只检查了if (answers[i] == 0)的情况,您需要一个else部分来处理不为真的情况,即answers[i] == 1
1.你的answers数组只有你的choices列表的一半大小,并且数组中的ith索引保存了关于i * 2i * 2 + 1选项的信息,但是现在你将answersith索引与你的选项列表的ith索引相关联。
classSummary方法的内部循环中的代码从:

public static void classSummary() {
    for (Student student : data) {
        int[] answers = student.getAnswers();
        for (int i = 0; i < answers.length; i++) {
            if (answers[i] == 0) {
                choices.get(i).setCount(choices.get(i).getCount() + 1);
            }
        }
    }
}

public static void classSummary() {
    for (Student student : data) {
        int[] answers = student.getAnswers();
        for (int i = 0; i < answers.length; i++) {
            if (answers[i] == 0) {
                choices.get(i * 2).setCount(choices.get(i * 2).getCount() + 1);
            } else {
                choices.get(i * 2 + 1).setCount(choices.get(i * 2 + 1).getCount() + 1);
            }
        }
    }
}
e4eetjau

e4eetjau2#

你甚至可以缩短@厄立特里亚建议的代码:

public static void classSummary() {
  for (Student student : data) {
    int[] answers = student.getAnswers();
    for (int i = 0; i < answers.length; i++) {
      int index = i * 2 + answers[i];
      choices.get(index).setCount(choices.get(index) + 1);
    }
  }
}

但是,您确实应该使用如下答案验证该文本文件的输入:

while (inFile2.hasNextLine()) {
  String line = inFile2.nextLine();
  String[] x = line.split(",");
  String name = x[0];
  int[] answers = new int[x.length - 1];
  for (int i = 1; i < x.length; i++) {
    answers[i - 1] = x[i].trim().equals("0") ? 0 : 1;
  }
  Student student = new Student(name, answers);
  data.add(student);
}

你可以用Map<Integer>代替ArrayList<Choices>(这意味着你不需要实现整个Choices类),在这种情况下,如果选择的顺序在结果中不重要,你可以使用HashMap,或者如果选择的顺序应该保持在输入文件中出现的顺序,你可以使用LinkedHashMap
或者在Choices类中实现一个方法increment来提高代码的可读性:

static class Choices {
  // ... existing parts go here
  void increment() {
    count++;
  }
}

这样,您将只写入choices.get(index).increment();,而不是choices.get(index).setCount(choices.get(index) + 1);

相关问题