DOMANDA Richiesta di chiarimenti sulla List in Java

Pubblicità

Scripta14

Nuovo Utente
Messaggi
95
Reazioni
8
Punteggio
25
Buonasera,

premetto che non sono ancora esperto e per questo motivo chiedo a voi una mano. Mi sto esercitando sulle Collection e mi sono imbattuto in un risultato che disattende le mie aspettative.
Quando stampo il contenuto della lista students, mi ripete l'informazione contenuta nella lista courses un numero di volte pari alla dimensione della lista students. Esempio se carico la lista students nel modo seguente:

Lista students
Pippo
Pluto
Paperino

e passo le informazioni nella lista courses
Matematica
Storia
Italiano
cioè il caricamento dei corsi dovrebbe essere distribuito per ogni soggetto, cioè 3+3+3.

Invece ho come risultato quando stampa students e courses

Pippo Matematica Matematica Matematica Storia Storia Storia Italiano Italiano
Pluto Matematica Matematica Matematica Storia Storia Storia Italiano Italiano
Paperino Matematica Matematica Matematica Storia Storia Storia Italiano Italiano

Il risultato da me atteso dove essere

Pippo Matematica Storia Italiano
Pluto Matematica Storia Italiano
Paperino Matematica Storia Italiano


Riporto il codice per completezza

Il codice della classe in cui viene caricata la lista students:

students.add(new Student("Mary");
students.add(new Student("Andrea");
students.add(new Student("Giulia");
students.add(new Student("Marco");


Course c1 = new Course("Matematica");
Course c2 = new Course("Storia");
Course c3 = new Course("Italiano");

Ho provato con il for
// for(int i=0; i<students.size();i++)
// {
// if (students.get(i)!=null) Student.enroll(c1);
// }

Ho provato con Iterator
Iterator<Student> iter=students.iterator();
while(iter.hasNext()){

if (iter.next()!=null) Student.enroll(c1,students.indexOf(iter));
}

Classe che gestisce il caricamento della lista courses

Ho provato sia nel modo seguente:
public static void enroll(Course c){

courses.add(c);
}

sia in questo altro modo:
public static void enroll(Course c, int i){

courses.add(i,c);
}

Purtroppo il risulta stampato a video è come indicato sopra.
Per favore qualcuno mi potrebbe dare una mano?
Spero di aver fornito il maggior numero di informazioni e in modo chiaro.
Grazie in anticipo per l'aiuto
 
Servirebbe un codice un pò più completo, comunque ritengo sia dovuto o al fatto che tu aggiunga alla lista lo stesso elemento più volte (le liste accettano i duplicati) o perchè gli studenti e i corsi non hanno un legame diretto.
 
Grazie per la risposta. Ti riporto le classi interessate. Ho tralasciato di riportare la parte dell'ordinamento che funziona senza problemi.
Aggiungo che prima di utilizzare le liste avevo usa gli array e funzionava correttamente. Ho modificato il codice per utilizzare le liste, ma la stampa a video e come riportato sopra.
Spero possa essere utile per potermi dare una mano a capire cosa sto sbagliando. Dimmi se sto sbagliando a ragionare.
Il ciclo richiama la prima cella della lista students. Non è vuota e allora richiama la lista courses e carica il primo corso per lo studente pippo. Passa nella seconda cella di students, dove è stato caricato pluto e carica la stessa materia e così via.
Decido di caricare un'altra materia. Rifaccio ripartire il ciclo e a pippo vado ad accodare alla materia già presente una seconda materia, e così via per tutti gli altri studenti caricati.
Mentre quello che mi esce è un'altra cosa.

Spero mi potrai e potrete aiutare.

Grazie

public class StudentSort {

List<Student> students;






public StudentSort() {

students= new ArrayList<>();




students.add(new Student("Mary");
students.add(new Student("Andrea");
students.add(new Student("Giulia");
students.add(new Student("Marco");


Course c1 = new Course("Matematica");
Course c2 = new Course("Storia");
Course c3 = new Course("Italiano");

/**Questa parte serve per caricare i corsi in base al numero di stundenti che
* seguono quel determinato corso
*/

//all students attend c1


// for(int i=0; i<students.size();i++)
// {
// if (students.get(i)!=null) Student.enroll(c1);
// }

Iterator<Student> iter=students.iterator();
while(iter.hasNext()){

if (iter.next()!=null) Student.enroll(c1,students.indexOf(iter));
}


//first 3 students attend c2


// System.out.println("dimensione di students " + students.size());
// for(int i=0; i<students.size();i++)
// {
// if (i<3) Student.enroll(c2);
//
// }



//students from 2 to 4 attend c3

//

// for(int i=0; i<students.size();i++)
// {
// if ((i>=2) || (i<5)) Student.enroll(c2);
// }
}



}


public class Student implements Comparable<Student> {


public enum Gender {
F, M
}
public final static Gender F = Gender.F;
public final static Gender M = Gender.M;

private int id;
private String first;
private String last;
private Gender gender;

static List<Course> courses;


public Student(int id, String first, String last, Gender gender) {
this.id = id;
this.first = first;
this.last = last;
this.gender = gender;

courses=new ArrayList<>();
}

public boolean isFemale(){
return gender == F;
}

public boolean isMale(){
return gender == M;
}

public int getId() {
return id;
}

public Gender getGender(){
return gender;
}


public String getFirst() {
return first;
}


public String getLast() {
return last;
}

public String toString(){
return "(" + id + ") " + last + ", " + first;
}



public List<Course> enrolledIn(){
return courses;
}

//
// public static void enroll(Course c){
// courses.add(c);
// }
//
//
public static void enroll(Course c, int i){

courses.add(i,c);
}

@Override
//ordinamento naturale per matricola
public int compareTo(Student other) {
return this.id - other.id;
}


}


public class Example {

public static void main(String[] args) {
StudentSort ss = new StudentSort();

List<Student> students = ss.sort();

for (Student s: students){
System.out.println(s.toString() +" " + s.enrolledIn());
}
}
 
// for(int i=0; i<students.size();i++)
// {
// if (students.get(i)!=null) Student.enroll(c1);
// }
Mi pare di capire che tu non stia aggiungendo il corso ad un preciso studente. Dovrebbe essere students.get(i).enroll(c1); ovvero allo studente in posizione i aggiungi il corso c1.
 
Pubblicità
Pubblicità
Indietro
Top