10

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?

6
  • Why is the normal for (one with index variable) not good enough? Commented Oct 11, 2013 at 12:59
  • consider a map. like hashmap Commented Oct 11, 2013 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. Commented Oct 11, 2013 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. Commented Oct 11, 2013 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) {...} Commented Feb 20, 2015 at 1:47

5 Answers 5

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());
}
Sign up to request clarification or add additional context in comments.

4 Comments

Agreed. There is no way to achieve this with the "foreach" variant of for.
@StefanWinkler At least not without merging the students and their marks into a single object.
i'd give +2 if i could. perfect answer + better solution
I can't believe some educational institutions teach OO languages, then give examples like this out (re: OP). Objects first, surely? (+1 to this answer)
9

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) {
  ...
}

Comments

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

}

Comments

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++)
{
...
}

1 Comment

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.
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());

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.