View Full Version : [JAVA] Vector
blackguardian
23-01-2010, 15:49
guardate questo pezzo di codice fatto da me
public double distanza(Point p1,Point p2){
return Math.sqrt(Math.pow((p1.x-p2.x),2)+Math.pow((p1.y-p2.y),2));
}
public double [] daiDistanze(Vector punti){
int dimArraydist=fatt(punti.size())/(2*fatt(punti.size()-2));
double [] distanze=new double [dimArraydist];
int pos=0;
for(int i=0;i<punti.size()-1;i++){
for(int j=i+1;j<punti.size();j++){
distanze[pos]=distanza(punti.elementAt(i),punti.elementAt(j)); // l'errore è qui
pos++;
}
}
return distanze;
}
mi da errore li quando metto il risultato del metodo distanza() dentro a distanze[pos], cioè mi segna di rosso "distanza" ( ti commento dove di ma l'errore...)
mi dice questo...
The method distanza(Point, Point) in the type CalcoloDistanze is not applicable for the arguments (Object,
Object)
Poichè Point è figlio di Object ovunque tu veda "Object" puoi usare "Point".
Non vale il contrario: dove c'è Point non puoi usare Object.
Il metodo elementAt di un Vector "raw" (cioè non parametrico) restituisce un Object, da cui l'errore.
Risolvi con una conversione esplicita:
distanza((Point) punti.elementAt(i), (Point)punti.elementAt(j));
che in tanto vale in quanto il tipo in esecuzione dei valori restituiti da elementAt(i) ed elementAt(j) siano Point o derivati di Point.
blackguardian
23-01-2010, 20:33
grazie mille ma poi sotto ho un altro errore cioè quando vado a creare un array per metterci all'interno i miei risultati
double [] risultati=daiDistanze(punti);
anche qui nn gli va bene
Considera che per quanto avanzati siano i linguaggi di programmazione restano comunque piuttosto stupidi, quantomeno se comparati all'idea di intelligenza umana cioè la capacità di prendere pessime decisioni sulla base di informazioni errate con argomentazioni che non stanno nè in cielo nè in terra.
Qui di errato non ci può essere molto:
double [] risultati=daiDistanze(punti);
"punti" è un java.util.Vector?
Se punti è un java.util.Vector allora è un problema di accesso al metodo daiDistanze. Bisognerebbe vedere il codice nel suo complesso per sapere con certezza quale sia il problema.
blackguardian
23-01-2010, 21:43
si punti è un java.util.Vector non capisco proprio cos'è che nn va...cmq l'errore che mi da è questo...
The method daiDistanze(Vector) in the type CalcoloDistanze is not applicable for the arguments
(Point[])
Stando al messaggio "punti" non è un java.util.Vector ma un array di oggetti Point.
banryu79
24-01-2010, 11:19
...quantomeno se comparati all'idea di intelligenza umana cioè la capacità di prendere pessime decisioni sulla base di informazioni errate con argomentazioni che non stanno nè in cielo nè in terra.
Stavi facendo del sarcasmo, vero? :D
blackguardian
24-01-2010, 13:18
punti è un Vector di oggetti point...creato in un'altra classe...quindi li invece di scriverci "punti" cosa devo scriverci?
Se punti è un Vector allora è giustissimo dire:
double[] p = daiDistance(punti).
Il problema è che il compilatore dice che quel nome "punti" lì dove lo usi è un Point[] ed è difficile che si sbagli.
Bisogna vedere il codice completo. Forse hai più cose che si chiamano "punti"?
blackguardian
24-01-2010, 13:59
allora forse il problema sta li nel mio primo post quando inizia il metodo
public double [] daiDistanze(Vector punti){
qui la parola Vector me la segna di giallo e mi dice che...
Vector is a raw type. References to generic type Vector<E> should be parameterized
secondo te? che significa?
Non è quello il problema.
L'ide ti segnala che stai usando una class generica (Vector) senza una dichiarazione di parametro.
Se vai a guardare la classe Vector vedi che è dichiarata con una lettera tra i segni <>:
Vector<E>
Significa che quando usi la classe Vector puoi specificare tra i segni <> il nome di un tipo. Tu usi:
Vector punti
ma potresti anche dire:
Vector<Point> punti
Quando dichiari il tipo di parametro il Vector che usi diventa un operatore sul tipo di oggetti stabilito dalla dichiarazione di parametro (in questo caso Point). Nel caso di Vector<X> l'operazione principale è il contimento (Vector<X> è qualcosa che contiene oggetti di tipo X).
Quando incontri una classe generica (cioè una classe che, come vector, è dichiarata nella forma NomeClass<Qualcosa>) è consigliabile usarla con una dichiarazione di parametro (cioè Vector<Point> anzichè Vector e basta) perchè il compilatore è in grado di verificare la compatibilità degli oggetti-operandi (quello che passi al vettore con i metodi add, setElementAt eccetera) con il tipo applicabile all'operatore (cioè il tipo dichiarato tra i segni < >), il che ti può risparmiare qualche raro ClassCastException e un po' di conversioni esplicite.
Tuttavia non è un errore usare un tipo generico senza dichiarazione di parametro e il programma compila e funziona ugualmente.
il problema è da qualche altra parte.
blackguardian
24-01-2010, 14:23
cosi mi creao il mio vettore Vector di punti
public class Case {
public int N;
public int M;
private Vector punti;
public Case (int N, int M) {
if (0 < N | N<=9 | 0 < M | M <= 200){
this.M = M;
this.N = N;
this.punti = new Vector();}
else System.out.println("I dati inseriti per N o M hanno un range errato");
}
public void aggiungiPunto(Point p){
punti.add(p);
}
public Point leggiPunto(int i){
return (Point)punti.get(i);
}
}
Mmhhh, la trama si infittisce.
La classe è ok.
La cosa strana è che in quella classe "punti" è un membro privato delle istenza di Case.
Significa che non hai modo di usare quel "punti" al di fuori del corpo della classe Case. Quandi scrivi:
Case case = new Case();
quel "case" ha dentro di sè un Vector "punti" ma quel "punti" è una cosa "privata", inaccessibile: solo case lo può usare.
Da che deduciamo che quando da qualche altra parte scrivi:
double p = daiDistance(punti)
il nome "punti" non fa riferimento a ciò che potrebbe sembrare.
Tieni conto che, in generale, non è sufficiente che due cose abbiano lo stesso nome perchè sia anche la stessa cosa.
Per la soluzione bisogna ancora avere il programma completo sottomano altrimenti si rischia di far confusione. A mo' di chiacchiera potrei dire che la classe Case potrebbe avere un metodo getPunti così fatto:
public Vector getPunti() {
return punti;
}
La dove usi daiDistance(punti)
dovresti anche avere un riferimento di tipo Case (cioè una riga che dice: Case case = new Case(qualcosa, qualcosa)). Il "punti" che passi a daiDistance diventerebbe quindi case.getPunti(), cioè:
double[] p = daiDistance(case.getPunti());
Ma è solo un'indicazione di massima che, ripeto, potrebbe più confondere le idee che schiarirle.
blackguardian
24-01-2010, 15:24
praticamente io leggo un filke txt e ho una classe che mi legge appositamente questa lettura che non c'entra niente con il mio problema cmq creo con un ciclo sempre un nuovo oggetto Case
Case c = new Case(N,M);
dove N ed M variano in base a quello che devo leggere..e memorizzo il Case c dentro un array cosi definito
Case[] casi = new Case[100];
per quanto riguarda invece gli oggetti punto (leggo anche quelli)
faccio
Point p= new Point(x,y);
e di volta in volta faccio
c.aggiungiPunto(p);
non capisco proprio cos'è che nn va...questo è tutto il mio programma non c'è altro :)
E' un problema di ambito dei nomi. Quando scrivi:
double p = daiDistance(punti)
la dichiarazione del nome "punti" dov'è?
blackguardian
24-01-2010, 16:03
li nella classe Case che ti ho postato prima quando faccio...
public Vector punti;
no??? oddio guarda mi sta facendo impazzire...:confused:
Non può essere quella.
public class Case {
public int N;
public int M;
private Vector punti;
public Case (int N, int M) {
if (0 < N | N<=9 | 0 < M | M <= 200){
this.M = M;
this.N = N;
this.punti = new Vector();}
else System.out.println("I dati inseriti per N o M hanno un range errato");
}
public void aggiungiPunto(Point p){
punti.add(p);
}
public Point leggiPunto(int i){
return (Point)punti.get(i);
}
}
Quel punti lì esiste solo nel corpo della classe Case. Al di fuori della classe Case "punti" non è accessibile.
Se il compilatore non ti da un "Cannot resolve symbol" ma dice che là dove lo usi "punti" è un Point[] significa che hai almeno un'altra variabile che hai chiamato "punti". Puoi incollare il codice completo della classe che contiene il metodo daiDistance?
blackguardian
24-01-2010, 16:19
public class CalcoloDistanze {
public double distanza(Point p1,Point p2){
return Math.sqrt(Math.pow((p1.x-p2.x),2)+Math.pow((p1.y-p2.y),2)); //calcolo matematico della distanza fra due punti
}
public double [] daiDistanze(Vector punti){
int dimArraydist=fatt(punti.size())/(2*fatt(punti.size()-2)); //calcolo delle disposizioni semplici senza ripetizioni
double [] distanze=new double [dimArraydist]; // nuovo vettore per memorizzare le distanze calcolate e la grandezza è data dalle disposizioni
int pos=0;
for(int i=0;i<punti.size()-1;i++){ // questi due cicli fanno in modo che un elemento si confronti con il successivo
for(int j=i+1;j<punti.size();j++){ //cioè slittati di una posizione
distanze[pos]=distanza((Point)punti.elementAt(i),(Point)punti.elementAt(j)); // richiamo il metodo che mi calcola la distanza fra due punti e me la mette
pos++; // dentro l'array distanze
}
}
return distanze;
}
private int fatt(int n){ //metodo per il calcolo del fattoriale
int i=1;
int fatt=1;
if(n>=0){
while(i<=n){
fatt=i*fatt;
i++;
}
}else{
fatt=-1;
}
return fatt;
}
public void daiRisultati(){ // questo metodo invece lo vado a mettere nel main o resta qui nn lo so devo decidere
double [] risultati=daiDistanze(punti);
for(int i=0;i<risultati.length;i++){
System.out.println(risultati[i]);}
Bene, adesso ci manca solo la classe che contiene l'invocazione del metodo daiDistance. Puoi incollare anche quella?
blackguardian
24-01-2010, 16:26
no ancora nn c'è cmq non diachiaro da nessun altra parte "punti"...non capisco proprio
Be' qui c'è qualcosa che mi sfugge: come fa a darti errore su un metodo che ancora non c'è?
Comunque, a prescidere qui:
public void daiRisultati() {
double [] risultati=daiDistanze(punti);
for(int i=0;i<risultati.length;i++){
System.out.println(risultati[i]);
}
}
se noti fai riferimento a un metodo "daiDistanze". Se il metodo è un metodo di istanza (e lo è) allora l'accesso a quel metodo deve essere qualificato: cioè prima di "daiDistanze" ci deve essere un "x." dove "x" è un'istanza di CalcoloDistanze. Ad esempio:
public void daiRisultati() {
CalcoloDistanze cd = new CalcoloDistanze();
double [] risultati=cd.daiDistanze(punti);
for(int i=0;i<risultati.length;i++){
System.out.println(risultati[i]);
}
}
Per il nome "punti" il discorso è simile: se con "punti" vuoi indicare il campo "punti" di un'istanza di Case allora prima di tutto devi verificare che il campo punti in Case sia accessibile, in secondo luogo dovrai far sì che la variabile punti che usi in daiRisultati faccia riferimento a quel campo. Una cosa tipo (ma per il tuo concreto programma non va bene):
public void daiRisultati() {
CalcoloDistanze cd = new CalcoloDistanze();
Case c = new Case(10, 20);
double [] risultati=cd.daiDistanze(c.getPunti());
for(int i=0;i<risultati.length;i++){
System.out.println(risultati[i]);
}
}
Tutto qua. Fai riferimento al libro su Java che usi e guarda i capitoli relativi all'ambito e all'accessibilità: lì troverai come funziona la faccenda.
blackguardian
24-01-2010, 17:35
qualcosa comincia a funzionare però tu mi hai inserito manualmente quel nuovo Case con i valori inseriti da te però io i case li leggo automaticamente con la classe con cui leggo il file, quindi richiamando il metodo con cui leggo il file cancello il Case che hai scritto tu manualmente e ora quello che nn riconosce è
double [] risultati=cd.daiDistanze(c.getPunti());
però in questo caso è la c che non digerisce perché...
c cannot be resolved
E' un sintomo diverso dello stesso problema. Da qualche parte nel tuo codice riempi un array di Case. Ipotizzo che tu poi voglia chiamare il metodo daiDistanze per ognuno dei Case contenuti in quell'array. Ciò che devi fare è prendere l'array di case che hai (proprio quell'array e non semplicemente una variabile di tipo array di Case avente magari lo stesso nome) e per ognuno dei suoi componenti invocare daiDistanze. Si può allora immaginare che il tuo metodo daiRisultati deva diventare una cosa così:
public void daiRisultati(Case c) {
double [] risultati=daiDistanze(c.getPunti());
for(int i=0;i<risultati.length;i++){
System.out.println(risultati[i]);
}
}
e che in qualche punto del tuo programma ci sia scritto:
for(Case e : ilMioArrayDiCase) {
daiRisultati(e);
}
Ma è tutto molto ipotetico.
blackguardian
24-01-2010, 17:55
bene...funziona
il main l'ho fatto cosi
public class Main {
public static void main(String[] args){
Case[] casi = Lettura.leggiInput();
CalcoloDistanze cd = new CalcoloDistanze();
for(Case c : casi) {
cd.daiRisultati(c);
}
}
}
e il metodo come hai detto tu
public void daiRisultati(Case c) {
double [] risultati=daiDistanze(c.getPunti());
for(int i=0;i<risultati.length;i++){
System.out.println(risultati[i]);
}
}
i risultati sono tutti corretti solo che mi scatena delle eccezioni di questo tipo
Exception in thread "main" java.lang.NullPointerException
at CalcoloDistanze.daiRisultati(CalcoloDistanze.java:41)
at Main.main(Main.java:13)
Se non hai bisogno dell'accesso concorrente usa la classe ArrayList al posto di Vector.
Inoltre conviene usare la specializzazione ArrayList<Tipo> (anche per questioni di efficienza ed evitarsi boxing/unboxing).
Una NullPointerException viene sollevata quando è eseguita un'espressione di accesso a membro e il riferimento acceduto è null. L'eccezione capita durante l'esecuzione della riga 41 di CalcoloDistanze
CalcoloDistanze.daiRisultati(CalcoloDistanze.java:41)
che supporrei essere questa:
double [] risultati=daiDistanze(c.getPunti());
Se effettivamente la riga fosse quella significherebbe che almeno uno dei componenti dell'array "casi" ottenuto da leggiInput non è inizializzato e bisognerebbe verificare il metodo leggiInput.
blackguardian
24-01-2010, 19:22
ok benissimo...ho ridotto la capienza del mio vettore casi invece che a 100 solo a 3 cioè i casi che in effetti ho el mio txt...se avrò tempo controllerò la condizione nella quale vi sarà un null poi vedo...per ora tutto funziona e posso andare avanti con il mio programma...non so come ringraziarti della tua pazienza e disponibilità...se avrò altri problemi non esiterò a contattarti...grazie di nuovo
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.