PDA

View Full Version : [Java]Problema metodo


maghico
13-05-2008, 15:25
Ciao a tutti, volevo chiedere un aiuto su un metodo in java, purtroppo il codice che ho scritto io mi funziona solo in parte...vi posto prima le classi che servono per il metodo:

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 gli array(lettura e stampa)

/** Gli oggetti di questa classe sono coppie, composte di un intero e una stringa.
*/

public class Coppia {

private int i;
private String s;



// NON INTRODURRE NESSUN COSTRUTTORE!
// Si usa il costuttore di default.


public int getI() {

return i;
}

public String getS() {

return s;
}


public void setI(int i) {

this.i = i;
}

public void setS(String s) {

this.s = s;
}


/**Da completare il metodo toString che metta sotto forma di stringa i valori dell'oggetto.*/
public String toString(){

return "Colore : " + s + " Numero volte : " + i;


}


}


questa classe serve per le coppie.

/** 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 Coppia.
*/

import java.util.*;
import static java.lang.System.*;

public class EseDic1{

public static void main(String [] args) {

Scanner tastiera = new Scanner(in);


// (1) Dichiarare un array di stringhe,chiamato arraystringhe, e riempirlo
// con parole a piacere
// usando il metodo readStringArray() di ArrayUtil.
String[] arraystringhe = ArrayUtil.readStringArray();


// (2) Richiamare opportunamente il metodo che avrete completato qui sotto
// e stamparne il risultato, stampando ANCHE l'array con l' opportuna
// println.
Coppia a = parolaPiuFrequente(arraystringhe);
System.out.println(a);
ArrayUtil.println(arraystringhe);



} // fine main


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


/** Il metodo parolaPiuFrequente() prende come argomento un array di stringhe,
conta le occorrenze delle stringhe contenute nell'array (cioe` conta il
numero di volte in cui una stringa compare nell'array) e restituisce una coppia
formata dalla stringa che ha il maggior numero di occorrenze *contigue* e dal
numero di occorrenze della stringa stessa.
Se tutte le stringhe hanno lo stesso numero di occorrenze il metodo restituisce
la coppia <"", 0>.
Ad esempio, dato l'array <"bianco", "blu", "blu", "rosso", "rosso", "rosso", "verde">,
il metodo restituira' la coppia <"rosso", 3>.
-Suggerimento-
Dovete utilizzare quattro variabili, la prime due servono rispettivamente per memorizzare
la stringa correntemente esaminata e per contare via via le sue occorrenze, le seconde due
servono rispettivamente per memorizzare la stringa che occorre di piu` fino a quel momento e
il numero di volte in cui occorre. Alla fine, nelle seconde due avremo il risultato che va
messo dentro la Coppia risultato.
*/
public static Coppia parolaPiuFrequente(String [] r) {
String a = "";
String b = "";
int c = 0;
int d = 0;

for(int i = 0; i < r.length - 1; i++){
a = r[i];
if(a.equals(r[i]) && a.equals(r[i+1])){
c++;
b = a;
d = c;
}
}

Coppia miaCoppia = new Coppia();
miaCoppia.setS(b);
miaCoppia.setI(d);
return miaCoppia;
}
}


infine questa è l'ultima classe dove vi è il metodo parolaPiuFrequente(String[] r), di cui riesco a fare solo in parte ciò che mi chiede, es. inserisco(rosso, rosso, rosso, blu, giallo, rosso) mi dice che la parola più frequente è il rosso però come numero di occorrenze mi stampa solo 2 invece di 4!
e poi quando inserisco(rosso, rosso, rosso) mi stampa sempre il colore rosso e numero di volte 2, al posto di "" e 0;cosa posso fare, è giusto il codice da me inserito?grazie mille a tutti

Don[ITA]
14-05-2008, 14:02
Da quanto ho capito ti serve un metodo che preso in input un array di stringhe ti ritorna la stringa ripetuta più volte in quell'array.
Dai un occhiata a questi metodi che fanno quello che ti serve in modi differenti.
public static String maxOccurrency(String[] s) {
String parola = "";
int maxOccurrency = 0;
int count = 0;
List<String> list = Arrays.asList(s);
for(String item : list) {
count = Collections.frequency(list, item);
parola = count > maxOccurrency ? item : parola;
maxOccurrency = count > maxOccurrency ? count : maxOccurrency;
}
return parola;
}

public static String maxOccurrencyRegEx(String[] s) {
String parola = "";
String trasformedArray = "";
for(String item : s)
trasformedArray += item;
Pattern pattern;
Matcher matcher;
int count = 0;
int maxOccurrency = 0;
for(String item : s) {
pattern = Pattern.compile(item);
matcher = pattern.matcher(trasformedArray);
while(matcher.find())
count++;
parola = count > maxOccurrency ? item : parola;
maxOccurrency = count > maxOccurrency ? count : maxOccurrency;
count = 0;
}
return parola;
}

Ciauz