Własne iteratory i pętla for-each

0

Witam, nie wiem jak ruszyć problem podany w temacie. Stworzyłem klasę student, której obiekty przechowują imię,nazwisko i 3 oceny. Napisałem iteratory po nazwiskach i po ocenach. Obiekty tej klasy przechowuję w ArrayList. Jak skonstruować możliwość użycia pętli for-each bym mógł w niej iterować moimi iteratorami?

Z góry dziękuję za pomoc :)

0

Nie bardzo rozumiem o co chodzi? Pętla for-each działa w jeden konkretny sposób czyli(w twoim przypadku):

for(Student s: ListaStudentów){
    //tutaj odwołujesz się do konkretnych elementów np. chcę zmienić wszystkim oceny na piątki 
    s.setOcena(5);
}
 

Zawsze możesz ominąć pętle for each na zwykłego for:

Student student;
for(int i=0;i<ListaStudentów.lenght();i++){
    //i tutaj dobierać się do konkretnego elementu
    student = ListaStudentów.get(i);
}

Chyba, że jeszcze o coś innego chodzi:)

0

Mam taką treść ćwiczenia:

  1. Napisać klasę studenta z imieniem i nazwiskiem oraz trzema ocenami, zrobić kolekcję 10 studentów i posortować ją na dwa sposoby - wg nazwiska i imienia oraz według jakiejś oceny (lub średniej z ocen). Wg nazwiska i imienia powinno być z wykorzystaniem compareTo w studencie a drugie z podaniem komparatora do sortowania.
  2. Napisać dwa iteratory do kolekcji studentów - po nazwisku i imieniu oraz ocenie. Mają działać z takim interfejsem: for(Student s : students.byName()); for(Student s : students.byGrade())

Pierwszą część zrobiłem, jeśli chodzi o drugą to nie rozumiem tego interfejsu tzn jak zrobić students.byName()

1

Pętla foreach w Javie działa dla obiektów dwóch typów:

  • tablice,
  • Iterable<T>,

Interfejs Iterable ma jedną metodę, która zwraca za każdym razem świeży Iterator, bo przecież użytkownik może chcieć iterować sobie wielokrotnie.

0

Okej, dzięki, już sobie poradziłem :D
//edit
Jednak nie do końca, albo nie do końca rozumiem jak ma działać to students.byGrade() i to drugie. Ja to zrozumiałem tak, że ta pętla ma przeiterować po posortowanej po ocenach kolekcji. Ale w tym problem, że nie użyłem w metodzie byGrade() takiego iteratora. Tu macie kod:

public class Students extends ArrayList<Student> {

    public List<Student> copyList(){
        List<Student> copy=new ArrayList<>();
        for(Student t : this){
            copy.add(new Student(t.getFirstName(),t.getLastName(),t.getGrade1(),t.getGrade2(),t.getGrade3()));
        }
        return copy;
    }

    public Iterable<Student> byLastName(){
        List<Student> copy=copyList();
        Collections.sort(copy,new Student.CompareLastName());
        return copy;
    }

    public Iterable<Student> byGrade(){
        List<Student> copy=copyList();
        Collections.sort(copy,new Student.CompareGrades());
        return copy;
    }
}
0

List implementuje interfejs Iterable, więc można jej użyć w foreach.

Chodzi ci o to, że nie zaimplementowałeś Iteratora bezpośrednio czy co?

0

No w treści zadania jest by napisać 2 iteratory które mają działać z tymi for'ami

0

A co za problem je klepnąć? Przykład:

import java.util.Iterator;

public class Iterators {
    public static void main(String[] args) {
        int[] elems = {4, 6, 3};
        for (int item : new MyCollection(elems)) {
            System.out.println(item);
        }
    }

    static class MyCollection implements Iterable<Integer> {
        private final int[] items;

        public MyCollection(int[] items) {
            this.items = items;
        }

        @Override
        public Iterator<Integer> iterator() {
            return new Iterator<Integer>() {
                private int position = 0;
                @Override
                public boolean hasNext() {
                    return position < items.length;
                }

                @Override
                public Integer next() {
                    return items[position++];
                }
            };
        }
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1