9

Student's names(String[]) and corresponding marks(int[]) are stored in different arrays.

How may I iterate over both arrays together using for each loop in Java ?

void list() {

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

One trivial way could be using index variable in the same loop. Is there a good way to do?

dev
  • 2,474
  • 7
  • 29
  • 47
  • Why is the normal for (one with index variable) not good enough? –  Oct 11 '13 at 12:59
  • consider a map. like hashmap – Philipp Sander Oct 11 '13 at 12:59
  • It should be noted that it is not very nice design to keep things that have an association in separate arrays. Instead you should use a map or create a simple class with name and mark attributes and have a single array (or list) of these objects. – Stefan Winkler Oct 11 '13 at 13:02
  • These two arrays are working in parallel, and their only association is via the index (so you can't use an enhanced for loop because you need to know the index). Stefan rightly points out this is very bad design that offers so little flexibility I don't think it's ever used outside of arbitrary examples. – TEK Oct 11 '13 at 13:17
  • 3
    Like the OP I'm disappointed there's no smarter way of doing it such as `for(String s : studentNames, int g : grades) {...}` – Sridhar Sarnobat Feb 20 '15 at 01:47
  • possible duplicate of [Sexy way to iterate over parallel arrays in Java using foreach](http://stackoverflow.com/questions/5545584/sexy-way-to-iterate-over-parallel-arrays-in-java-using-foreach) – Nils von Barth Jun 05 '15 at 04:52

5 Answers5

14

You need to do it using the regular for loop with an index, like this:

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

A better approach would be using a class to store a student along with his/her marks, like this:

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());
}
Sergey Kalinichenko
  • 714,442
  • 84
  • 1,110
  • 1,523
8

The underlying problem is actually that you should tie both of the arrays together and iterate across just one array.

Here is a VERY simplistic demonstration - you should use getters and setters and you should also use a List instead of an array but this demonstrates the point:

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

for (Student s : students) {
  ...
}
OldCurmudgeon
  • 64,482
  • 16
  • 119
  • 213
4

If them both have the same size, I would write:

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

}
Philipp Sander
  • 10,139
  • 6
  • 45
  • 78
Maxim Shoustin
  • 77,483
  • 27
  • 203
  • 225
0

The other way is to use a verbose for loop statement such as;

int i,j;
for(i = 0, j=0; i<= student.length-1 && j <=grades.length-1; i++,j++)
{
...
}
  • You could just use a single variable `i`. There will never be a case where `i != j`. In which case, it's not verbose, and is honestly just the correct way to do it. – Nicholas Pipitone Oct 11 '18 at 21:37
0

Going with Sergey Kalinichenko's something is wrong:

    if (marks.length != studentNames.length) {
        ... // Something is wrong!
    }
    Iterator<Integer> marks_ = java.util.Arrays.asList(marks).iterator();
    // This assumes that studentNames is no longer than marks
    for (String name: studentNames)
        System.out.println(name + ": " + marks_.next());
greybeard
  • 2,249
  • 8
  • 30
  • 66