View Full Version : [Java] Confrontare stringhe di numeri
Ho 10 array di uguali dimensioni contenenti ciascuno una stringa di numeri separati solo dal carattere "\n", quindi se andassimo a stamparli sarebbero tutti in colonna. I valori contenuti sono diversi, ma tutti numeri interi.
Devo confrontare tutti questi array per trovare i 3 tra loro più simili. Con simili intendo che abbiano i valori più vicini:
es.
Array A= 10, 20, 30, 45
Array B= 10, 15, 50, 60
differenze: 10-10=0, 20-15=5, 50-30=20, 60-45= 15
totale differenza: 0+5+20+15= 40
E fare questo confronto con ogni array per trovare i tre che hanno il totale differenza minore.
Come posso fare questa cosa?
wingman87
19-01-2012, 16:37
Per convertire i numeri puoi usare
http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#split%28java.lang.String%29
e
http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Integer.html#parseInt%28java.lang.String%29
brodaglia
19-01-2012, 17:00
Ho 10 array di uguali dimensioni contenenti ciascuno una stringa di numeri separati solo dal carattere "\n", quindi se andassimo a stamparli sarebbero tutti in colonna. I valori contenuti sono diversi, ma tutti numeri interi.
Devo confrontare tutti questi array per trovare i 3 tra loro più simili. Con simili intendo che abbiano i valori più vicini:
es.
Array A= 10, 20, 30, 45
Array B= 10, 15, 50, 60
differenze: 10-10=0, 20-15=5, 50-30=20, 60-45= 15
totale differenza: 0+5+20+15= 40
E fare questo confronto con ogni array per trovare i tre che hanno il totale differenza minore.
Come posso fare questa cosa?
Non è banale, dovresti confrontare ogni array con tutti gli altri e salvare da qualche parte le differenze tra gli array confrontati.
Per evitare di allocare troppa roba in memoria, direi che alla fine del ciclo dovresti conservare solo i 3 con differenza minore.
Per farlo potresti utilizzare un oggetto ordinablie in maniera custom con struttura chiave -> valore tipo un TreeMap.
Alla fine del confronto, nelle prime 3 posizioni avrai quello che ti interessa, relativamente al primo array.
Es. nel TreeMap avrai :
A <differenza> B , 1
A <differenza> C , 3
A <differenza> D , 5
A <differenza> E , 7
Elimini l'utlimo e hai i primi 3 con differenza minore.
Ora devi confrontare tutti gli altri allo stesso modo.
Più o meno dovrebbe essere questa la logica da utlizzare.
Se ti serve proprio il codice da ulitizzare dovresti scrivermi come ricevi l'input.
Questa è la parte di codice interessata:
public static void main(String[] args) throws IOException{
File f = new File("./MiaCartella");
File[] files = f.listFiles();
for(int k = 0; k < files.length; k++){
//per ogni file contenuto nella cartella (ne metto 10), questo genera un array MioArray[] di 256 valori
int[] mioArray = new int[256];
for(int i=0;i<arrayP.length;i++){
mioArray[arrayP[i]]++;
arrayP[i] = 0xff000000 | arrayP[i] * 0x10101;
}
}
}
Faccio notare che in questo caso il carattere "\n" di cui parlavo nel primo post non esiste, negli array ci sono solo numeri interi.
Dovrei quindi salvare i 10 array all'esterno del ciclo for() e fare i confronti di cui parlavo.
wingman87
26-01-2012, 19:29
Qual è la domanda?
All'interno del ciclo for mi crea un array. Ogni array compilato lo devo salvare da qualche parte sennò a ogni nuovo file in input mi sovrascrive l'array precedente. Mi era venuta un'idea del genere: creare un contatore numArray=0 e ad ogni ciclo compiuto incrementarlo di uno. La cosa che vorrei fare è però assegnare questo numero al nome dell'array... cioè in modo che lui mi crei da solo Array0, Array1, Array2 ecc...
E' possibile farlo? Oppure un modo migliore?
banryu79
27-01-2012, 14:38
@ello:
l'utente "brodaglia" (dio, che nick :D) ti aveva già illustrato la soluzione. L'hai compresa?
Prova a scriverla in pseudo-codice: farlo ti aiuterà a comprenderla e a strutturarla, solo dopo cimentati con la stesura del sorgente. ;)
@ello:
l'utente "brodaglia" (dio, che nick :D) ti aveva già illustrato la soluzione. L'hai compresa?
Prova a scriverla in pseudo-codice: farlo ti aiuterà a comprenderla e a strutturarla, solo dopo cimentati con la stesura del sorgente. ;)
Lo so, ma non ho la più pallida idea di come farlo...
banryu79
27-01-2012, 14:46
Lo so, ma non ho la più pallida idea di come farlo...
Bene, allora facciamo assieme.
Mi pare di aver capito che il tuo programma legge da un file di testo i dati in input, per piacere, copia&incolla qui il contenuto di questo file, così possiamo esaminarlo per stabilire come estrarre i dati.
Una volta fatto questo analizzermo il problema tentando di spezzarlo, se è il caso, in parti più piccole per risolverlo.
Nota che è esattamente quello che abbiamo appena fatto: abbiamo "spezzato" l'aquisizione dei dati in input dal resto del problema.
No non legge da file di testo, chiedo scusa se mi sono spiegato male. Il programma in pratica legge dei file immagini in una cartella, passa tutti i pixel e prende i valori di luminosità. Alla fine per ogni immagine viene creato il relativo array di 256 valori che rappresenta l'istogramma dell'immagine.
Sono questi array di ogni immagine che devo confrontare.
public static void main(String[] args) throws IOException{
File f = new File("./MiaCartella");
File[] files = f.listFiles();
for(int k = 0; k < files.length; k++){
BufferedImage immagine = ImageIO.read(files[k]);
int[] arrayPixel = immagine.getRGB(0, 0, w, h, null, 0, w);
float[] arrayHSB = new float[3]; //HSB= hue, saturation, brightness
for(int j=0; j<arrayPixel.length;j++){
int rgb = arrayPixel[j];
Color.RGBtoHSB((rgb >> 16) & 255, (rgb >> 8) & 255, (rgb) & 255, arrayHSB);
arrayPixel[j] = (int) (arrayHSB[2] * 255);
}
int[] istogramma = new int[256];
//Questo crea l'array finale che mi serve da confrontare
for(int i=0;i<arrayPixel.length;i++){
istogramma[arrayPixel[i]]++;
arrayPixel[i] = 0xff000000 | arrayPixel[i] * 0x10101;
}
//Qua creo una stringa solo nel caso mi serva l'output dell'array in formato testo
String out = "";
for(int i=0;i<istogramma.length;i++){
out += i + " " + istogramma[i] + "\n";
}
}
}
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.