PDA

View Full Version : [Java]Problema risoluzione metodo


maghico
06-05-2008, 14:17
Ciao a tutti sto svolgendo un esercizio e non riesco a fare un metodo, vi posto le due classi che servono per l'esercizio!

import java.util.Scanner;

public class ArrayUtil{

/* completare il corpo del metodo statico read per la lettura di array di interi che:

1- chieda all'utente la lunghezza dell'array da creare e forzi l'utente a inserire un intero;
2- crei un array della lunghezza giusta;
3- chieda all'utente i singoli elementi dell'array e li inserisca nell'array;
4- restituisca l'indirizzo dell'array creato.

QUESTO METODO E' STATO VISTO A LEZIONE. POTRA' ESSERE USATO IN FUTURO OGNI VOLTA CHE SI
VOGLIANO LEGGERE ARRAY DI INTERI*/
static Scanner input = new Scanner(System.in);
public static int [] read(){

int [] nuovoarray;
System.out.println("Di che lunghezza vuoi l'array? ");
while(!input.hasNextInt()){
input.next();
System.out.println("Immetti un intero.");
}
int n = input.nextInt();
nuovoarray = new int[n];
for(int i = 0; i < n; i++){
System.out.print("Immetti l'elemento n "+i+":");
nuovoarray[i] = input.nextInt();
}

return nuovoarray;
}


/* Scrivere il corpo del metodo statico println per stampare i valori di un array
di interi a.

IL METODO E' STATO VISTO A LEZIONE. POTRA' ESSERE USATO IN FUTURO OGNI VOLTA CHE SI
VOGLIANO STAMPARE ARRAY DI INTERI. */

public static void println(int [] a){

System.out.println("l' array e' : ");
int n = a.length;
for(int i = 0; i < n; i++){
System.out.print(a[i] + "");
}
System.out.println();
}


/* Analogamente a quanto appena fatto, si definiscano i metodi:

public static double[] readDoubleArray()
public static void println(double[] a)

per leggere e scrivere array di doubles;

Inoltre si definiscano:

public static String[] readStringArray()
public static void println(String[] a)

per leggere e scrivere array di stringhe;

ANCHE QUESTI METODI POTRANNO ESSERE USATI NEGLI ESERCIZI FUTURI */

public static double[] readDoubleArray(){

double [] nuovoarray1;
System.out.println("Di che lunghezza vuoi l'array? ");
while(!input.hasNextInt()){
input.next();
System.out.println("Immetti un intero.");
}
int a = input.nextInt();
nuovoarray1 = new double[a];
for(int i = 0; i < a; i++){
System.out.print("Immetti l'elemento n "+i+":");
nuovoarray1[i] = input.nextInt();
}
return nuovoarray1;
}


public static void println(double[] a){

System.out.println("l'array e' : ");
double n = a.length;
for(int i = 0; i < n; i++){
System.out.println(a[i] + "");
}
System.out.println();
}



public static String[] readStringArray(){

String [] nuovoarray2;
System.out.println("Di che lunghezza vuoi l'array? ");
while(!input.hasNextInt()){
input.next();
System.out.println("Immetti un intero.");
}
int a = input.nextInt();
nuovoarray2 = new String[a];
for(int i = 0; i < a; i++){
System.out.println("Immetti l'elemento n" + i + " : ");
nuovoarray2[i] = input.next();
}
return nuovoarray2;
}


public static void println(String[] a){

System.out.println("l'array e' : ");
int n = a.length;
for(int i = 0; i < n; i++){
System.out.println(a[i] + "");
}
System.out.println();
}


}

questa classe serve per l'array...

/** Gli oggetti di questa classe sono triple, composte da tre interi.

*/



public class Tripla {



private int i;

private int j;

private int k;







// NON INTRODURRE NESSUN COSTRUTTORE!

// Si usa il costuttore di default.





public int getI() {



return i;

}



public int getJ() {



return j;

}



public int getK() {



return k;

}



public void setI(int i) {



this.i = i;

}



public void setJ(int j) {



this.j = j;

}



public void setK(int k) {



this.k = k;

}





/**Da completare il metodo toString che metta sotto forma di stringa i valori dell'oggetto.*/

public String toString(){



return (" " + i + " " + j + " " + k);



}





}


questa classe stampa la tripla...

/** Questa classe usa i metodi readStringArray() e

println(String [] a) di ArrayUtil.

Controllare la corrispondenza dei nomi di questi metodi coi nomi

dei metodi della VOSTRA classe ArrayUtil.



Usa inoltre la classe Tripla.

*/



import java.util.*;

import static java.lang.System.*;



public class Esame{



static Scanner tastiera = new Scanner(in);



public static void main(String [] args) {





// (1) Dichiarare un array di stringhe,chiamato mioarray, e riempirlo

// con stringhe a piacere

// usando il metodo readStringArray() di ArrayUtil.

String[] mioarray = ArrayUtil.readStringArray();





// (2) Richiamare opportunamente il metodo che avrete completato qui sotto

// e stamparne il risultato, stampando ANCHE l'array con l' opportuna

// println.

Tripla a = treMin(mioarray);

System.out.println("La lunghezza delle stringhe e' : " + a);

ArrayUtil.println(mioarray);







} // fine main





/** (3) Definire il metodo statico indicato qui sotto.

*/





/** Il metodo treMin prende come argomento un array di stringhe,

e restituisce un oggetto Tripla che contiene le tre lunghezze delle stringhe più corte.

Ad es. con: {a,abcd,bc,ss,sssss,irtsd,uuuu}

si ottiene: <1,2,2>.

Se ci sono meno di tre elementi nell'array si mettano degli 0

nei posti opportuni,

ad es. con: {aa,s}

si ottiene: <2,1,0>.



Per svolgere l'esercizio,si usino tre variabili min1, min2, min3 per memorizzare rispettivamente

la lunghezza della stringa più corta, quella della seconda stringa più corta ecc. tra le stringhe esaminate fino a quel momento.

*/

public static Tripla treMin(String [] a) {







int min1 = 0;

int min2 = 0;

int min3 = 0;

int l;

for(int i = 0; i < a.length; i++){

l = a[i].length();



if(l < min1){

min3 = min2;

min2 = min1;

min1 = l;

}

else if(l < min2){

min3 = min2;

min2 = l;

}

else if(l < min3){

min3 = l;

}





}



Tripla miaTripla = new Tripla();

miaTripla.setI(min1);

miaTripla.setJ(min2);

miaTripla.setK(min3);

String tmp = miaTripla.toString();

System.out.println(tmp);



return miaTripla;









}



}





infine questa è la classe dove c'è il metodo treMin(String [] a) che non riesco a fare, ovvero mi stampa a video soltanto i tre valori 0 e non la lunghezza delle stringhe!chiedo il vostro aiuto!grazie mille

wingman87
06-05-2008, 14:28
Modifica il titolo come da regolamento.
Il problema è dovuto al fatto che hai inizializzato i 3 min a zero, quindi nel ciclo non capiterà mai che la lunghezza di una stringa sia minore di uno di questi 3 valori.

maghico
06-05-2008, 14:33
per il titolo devo mettere [Java]?

l'errore l'ho capito però l'esercizio mi chiede che se vengono messe due stringhe mi darà solo la lunghezza di quelle due e al posto della terza io avrò il valore 0!

wingman87
06-05-2008, 14:56
Il titolo adesso va bene.
Provo a proporti una soluzione:
Inizializza le variabili min a Integer.MAX_VALUE
Alla fine del metodo, quando copi i valori dei min nella Tripla fai una cosa del genere:
miaTripla.setI(a.length>=1?min1:0);

miaTripla.setJ(a.length>=2?min2:0);

miaTripla.setK(a.length>=3?min3:0);

maghico
06-05-2008, 15:03
ok,il problema è risolto...mi puoi spiegare gentilmente cosa significa questo passaggio:

miaTripla.setI(a.length>=1?min1:0);

miaTripla.setJ(a.length>=2?min2:0);

miaTripla.setK(a.length>=3?min3:0);

wingman87
06-05-2008, 15:07
Sì, quello che ho usato è l'operatore ternario e si utilizza in questo modo:
variabile=(espr-booleana)?espr1:espr2;
Se espr-booleana è true viene assegnato a variabile il valore espr1, altrimenti il valore espr2.

maghico
06-05-2008, 16:47
scusa se rispondo adesso, mi hai chiarito tutti i dubbi!grazie mille...:D :D