【问题标题】:Iterating over two arrays simultaneously using for each loop in Java使用Java中的每个循环同时迭代两个数组
【发布时间】:2013-10-11 12:56:37
【问题描述】:

学生的姓名(String[])和对应的分数(int[])存储在不同的数组中。

如何在 Java 中使用 for each loop 一起迭代两个数组?

void list() {

    for(String s:studentNames) {
        System.out.println(s); //I want to print from marks[] alongside.
    }
}

一种简单的方法是在同一个循环中使用索引变量。有什么好办法吗?

【问题讨论】:

  • 为什么正常的for(带有索引变量的)不够好?
  • 考虑一张地图。像哈希图
  • 应该注意的是,将具有关联的事物保存在单独的数组中并不是很好的设计。相反,您应该使用地图或创建具有名称和标记属性的简单类,并拥有这些对象的单个数组(或列表)。
  • 这两个数组并行工作,它们唯一的关联是通过索引(因此您不能使用增强的 for 循环,因为您需要知道索引)。 Stefan 正确地指出这是一个非常糟糕的设计,它提供的灵活性非常小,我认为它从未在任意示例之外使用过。
  • 就像 OP 我很失望没有更聪明的方法,例如for(String s : studentNames, int g : grades) {...}

标签: java foreach


【解决方案1】:

您需要使用带有索引的常规 for 循环来执行此操作,如下所示:

if (marks.length != studentNames.length) {
    ... // Something is wrong!
}
// This assumes that studentNames and marks have identical lengths
for (int i = 0 ; i != marks.length ; i++) {
    System.out.println(studentNames[i]);
    System.out.println(marks[i]);
}

更好的方法是使用类来存储学生及其分数,如下所示:

class StudentMark {
    private String name;
    private int mark;
    public StudentMark(String n, int m) {name=n; mark=m; }
    public String getName() {return name;}
    public int getMark() {return mark;}
}

for (StudentMark sm : arrayOfStudentsAndTheirMarks) {
    System.out.println(sm.getName());
    System.out.println(sm.getMark());
}

【讨论】:

  • 同意。使用 for 的“foreach”变体无法实现此目的。
  • @StefanWinkler 至少在没有将学生和他们的分数合并到一个对象的情况下是这样。
  • 如果可以的话,我会给 +2。完美答案+更好的解决方案
  • 我不敢相信一些教育机构教OO语言,然后举出这样的例子(re:OP)。对象优先,确定吗? (对此答案+1)
【解决方案2】:

根本问题实际上是您应该将两个数组绑定在一起并只遍历一个数组。

这是一个非常简单的演示 - 您应该使用 getter 和 setter,还应该使用 List 而不是数组,但这说明了这一点:

class Student {
  String name;
  int mark;
}
Student[] students = new Student[10];

for (Student s : students) {
  ...
}

【讨论】:

    【解决方案3】:

    如果它们的大小相同,我会写:

    for(int i = 0; i<marks.length; i++) {
        String names= studentNames[i]
        int mark = marks[i];     
    
    }
    

    【讨论】:

      【解决方案4】:

      另一种方法是使用冗长的for循环语句,例如;

      int i,j;
      for(i = 0, j=0; i<= student.length-1 && j <=grades.length-1; i++,j++)
      {
      ...
      }
      

      【讨论】:

      • 你可以只使用一个变量i。永远不会有i != j 的情况。在这种情况下,它并不冗长,而且老实说只是正确的方法。
      猜你喜欢
      • 2016-05-08
      • 1970-01-01
      • 1970-01-01
      • 2015-11-13
      • 2015-05-26
      • 2023-01-14
      • 2020-02-03
      • 1970-01-01
      • 2016-04-07
      相关资源
      最近更新 更多