PDA

View Full Version : [java] array


blindwrite
09-12-2008, 13:29
vorrei creare un array di persone che hanno come attributi nome cognome e età:
ho creato queste tre classi:

public class Main {


public static void main(String[] args) {
Persone people ;
people = new Persone(2);
people.addPeople("Andrea" , "Cognome", "21", 0);
people.addPeople("Cris", "Cognome", "24", 1);
System.out.println(people.print(0));
}

}


public class Persone {
Attributi x;

private Persone [] people;

public Persone(int a){
people = new Persone[a];

}
public void addPeople (String a , String b , String c , int y){
people[y].x = new Attributi(a,b,c);

}
public String print(int i) {
return people[i].x.nome + people[i].x.cognome + people[i].x.eta;


}
}

public class Attributi {
String nome;
String cognome;
String eta;

public Attributi(String a, String b, String c) {

this.nome=a;
this.cognome=b;
this.eta=c;
}
}


Ho un errore di NullPointerException nella riga di codice che ho grassettato.
Questo è il mio primo programma in java (eccetto Hello World) e forse mi mancano alcuni concetti basilari...
Qualcuno può dare uno sguardo e dirmi cosa sbaglio (se è un errore di concetto o altro).

Grazie

Oceans11
09-12-2008, 13:53
Sostanzialmente penso sia un errore di concetto, riguardo al paradigma della programmazione ad oggetti.
Ragioniamo così: abbiamo bisogno di un insieme omogeneo (array) di Persona (oggetti della classe Persona) di cui ci serve tenere memoria del nome, cognome ed età.

Quindi già si sono manifestate 2 possibili classi:

Persona:

public class Persona {
private String nome;
private String cognome;
private int eta;

public Persona(String a, String b, int c) {
nome = a;
cognome = b;
eta = c;
}
}


e (chessò io....diciamo) Persone:

public class Persone {
private Persona[] people;

public Persone(int a) {
people = new Persone[c];
}

public void addPeople(String a , String b , int c , int y}
Persona p = new Persona(a, b, c);
people[y] = p;
}

/**
* qui ci metti tutti gli altri metodi necessari
*/
}


Infine avrai bisogno di una classe cliente (nb: una classe ulteriore, ti conviene, perchè così non mischi con l'implementazione) che avrà il main e da cui farai partire il tutto.

banryu79
09-12-2008, 16:49
ùvorrei creare un array di persone che hanno come attributi nome cognome e età:
ho creato queste tre classi:
...cut...


Ciao, stai solo facendo un esercizio in cui usi gli array perchè vuoi imparare a conoscerne l'utilizzo in Java?
Se non sei costretto per qualche motivo particolare ad usare gli array, la cosa migliore sarebbe sostituire il tuo array di oggetti Persona con un ArrayList di oggetti Persona, in questo modo non dovresti neanche preoccuparti di gestire la dimensione della tua collezione perchè lo fa ArrayList dinamicamente.
(ArrayList è una delle struttre dati disponibili nel Collection Framework di Java, lo trovi, insieme ai suoi amici, in nel package java.util).

blindwrite
09-12-2008, 17:09
Sostanzialmente penso sia un errore di concetto, riguardo al paradigma della programmazione ad oggetti.
Ragioniamo così: abbiamo bisogno di un insieme omogeneo (array) di Persona (oggetti della classe Persona) di cui ci serve tenere memoria del nome, cognome ed età.

Quindi già si sono manifestate 2 possibili classi:

Persona:

public class Persona {
private String nome;
private String cognome;
private int eta;

public Persona(String a, String b, int c) {
nome = a;
cognome = b;
eta = c;
}
}


e (chessò io....diciamo) Persone:

public class Persone {
private Persona[] people;

public Persone(int a) {
people = new Persone[c];
}

public void addPeople(String a , String b , int c , int y}
Persona p = new Persona(a, b, c);
people[y] = p;
}

/**
* qui ci metti tutti gli altri metodi necessari
*/
}


Infine avrai bisogno di una classe cliente (nb: una classe ulteriore, ti conviene, perchè così non mischi con l'implementazione) che avrà il main e da cui farai partire il tutto.

Io avevo visto il problema in questo modo:
creo un main da cui avviare tutto, in questo main creo un array di persone di dimensione stabilite (non mi serve che si possa estendere ).
Per fare ciò ho bisogno di una classe ulteriore (Persone) che deve essere fisicamente il mio array. Persone infine deve contenere degli attributi (stringhe), quindi ho creato un altra classe per gestire questi attributi.

Ora non sono sicuro che questo tipo di struttura (annidata) sia implementabile, ma sicuramente adesso cercherò di capire meglio quello che mi suggerivi di fare.

x Xbanryu79
si faccio esercizi per capire come funzionano, poi devo implementarli in un programma di gestione. Sono costretto ad usare gli array quindi nessun'altra alternativa

Oceans11
09-12-2008, 22:28
Sì ma devi stare attento: un array di Persone è un array di Persona in realtà :D

Già sembra astruso il ragionamento, ma tu la devi vedere così:
ogni elemento dell'array è uno (ed uno solo) oggetto di tipo Persona.
Altrimenti cadi in errore.
L'errore che ti lancia NullPointer è dovuto al fatto che stai tentando di accedere al campo di un oggetto non inizializzato. Quindi dirai tu: "benissimo, inizializziamolo". Già, ma che tipo di oggetto è quello? Persone?!?! :mbe:
Ogni elemento di Persone (ricordiamolo, un array) è a sua volta un altro array???
Così non si finisce più....:eek:

blindwrite
09-12-2008, 23:33
credo di aver afferrato, comunque questo pezzo di codice non può essere corretto
public class Persone {
private Persona[] people;

public Persone(int a) {
people = new Persone[c];
}

cut...

Quello in grassetto deve essere Persona o sbaglio??

Oceans11
10-12-2008, 08:13
Sì perchè:

1) la variabile "people" l'hai dichiarata come array di tipo Persona
2) per i motivi che ti spiegavo.

blindwrite
10-12-2008, 18:44
Alla fine ho resettato tutte le idee e ho fatto così
public class Main {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Persona [] famiglia = new Persona[4]; //creo uno spazio di puntatori a persona
famiglia[0]= new Persona("Andrea","cognome","21"); //inizzializzo persona 0
famiglia[1]= new Persona("Cristiano","cognome","24");
famiglia[2]= new Persona("Aldo","cognome","unknown");
famiglia[3]= new Persona("Tea","cognome","più di 40");
int i;
for(i=0;i<4;i++){
famiglia[i].print(famiglia[i], i);
}
}

}


public class Persona {
String nome;
String cognome;
String eta;


public Persona(String string, String string2, String string3) {
nome=string;
cognome=string2;
eta=string3;
}


public void print(Persona persona, int i) {
// TODO Auto-generated method stub
String tmp;
tmp=persona.nome+" " +persona.cognome+" " + persona.eta;
System.out.println(tmp);
}
}



Che in effetti fa in maniera molto più semplice quello che volevo fare.

blindwrite
10-12-2008, 19:11
Adesso ho provato ad impaccare più un array in un altro (quella che era la mia idea iniziale) e ci sono riuscito con questo codice
public class Main {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Persona [] famiglia = new Persona[4]; //creo uno spazio di puntatori a persona
famiglia[0]= new Persona("Andrea","cognome","21",0); //inizzializzo persona 0
famiglia[1]= new Persona("Cristiano","cognome","24",1);
famiglia[2]= new Persona("Aldo","cognome","unknown",2);
famiglia[3]= new Persona("Tea","cognome","più di 40",3);


System.out.println(famiglia[3].x[1].contenuto);
}

}

public class Persona {
Attributi x[];


public Persona(String a, String b, String c, int i) {
x = new Attributi[3];
int k;
for(k=0;k<3;k++){
x[k]= new Attributi(a,b,c,k);
}
}


}


public class Attributi {
String contenuto;
public Attributi(String a, String b,String c, int i) {
if(i==0){
contenuto=a;

}
if(i==1){
contenuto=b;
}
if(i==2){
contenuto=c;
}
}

}


Alla fine fa la stessa cosa del codice di prima, ma è risolto in modo molto più complesso (dato che il problema da risolvere è banale)...
Comunque questo tipo di struttura è quello che mi serve per risolvere il problema vero della gestione della libreria