Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Java - Confrontare contenuto array?
Forum - Java - Confrontare contenuto array?

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
mullo (Normal User)
Rookie


Messaggi: 37
Iscritto: 16/03/2010

Segnala al moderatore
Postato alle 17:40
Mercoledì, 18/01/2012
Ho dieci array di dimensioni uguali, contenuti diversi, ma solo numeri interi. Come posso confrontare questi numeri in modo da trovare i tre array che hanno i valori più simili tra loro?
Per simili intendo: nello spazio 0 dell' array A ho il valore 50, nello spazio 0 dell' array B ho il valore 30, nello spazio 0 dell' array C ho il valore 48. Quindi tra questi A e C sono i più simili, ma ovviamente il confronto andrebbe fatto con tutti gli spazi.
Spero di essermi spiegato bene...

Ultima modifica effettuata da mullo il 18/01/2012 alle 17:41
PM Quote
Avatar
subazu (Normal User)
Rookie


Messaggi: 35
Iscritto: 06/08/2011

Segnala al moderatore
Postato alle 18:37
Mercoledì, 18/01/2012
Io farei cosi:

Allochi un array da numeroArray elementi, nel tuo caso da 0 a 9, qualsiasi sia la dimensione degli array da confrontare, di tipo intero e lo inizializzi tutto a 0.

Cicli sulla grandezza degli array grandi e per ogni copia di elementi fai:
valore assoluto  ( elementoArray1 - elementoArray2 )
cosi facendo trovi la distanza tra i 2 numeri
es:
+10, + 7 -> 10 - 7 = 3 ; 7 - 10 = 3
-10, - 10 -> -10 + 10 = 0
-10, +10 -> -10 - 10 = 20

Sommi al valore esistente nell'array piccolo il valore trovato.

Alla fine nell'array piccolo hai le distanze tra gli array.

Non ho alcuna conoscenza di Java però :k:

Edit:
Rileggendo il tuo post mi sono accorto di aver interpretato male il tuo problema.
L'esempio del valore assoluto è ancora valido, ma serve unicamente per calcolare la distanza fra 2 numeri.
Invece l'array piccolo, quello con i risultati non sarà grande come il numero di Array contenenti i dati, ma come il numero di terzine che ci sono, che se non sbaglio è uguale a: n * (n - 1) * (N - 2) con n = 10 nel tuo caso.

Ultima modifica effettuata da subazu il 18/01/2012 alle 22:57
PM Quote
Avatar
mullo (Normal User)
Rookie


Messaggi: 37
Iscritto: 16/03/2010

Segnala al moderatore
Postato alle 22:03
Mercoledì, 18/01/2012
Mmm che casino, mi hai un po' confuso con "array grandi" e "piccoli", proverò a rileggere con calma. Comunque il discorso del valore assoluto mi pare vada bene in effetti, magari domani provo a vedere cosa riesco a fare.

PM Quote
Avatar
mullo (Normal User)
Rookie


Messaggi: 37
Iscritto: 16/03/2010

Segnala al moderatore
Postato alle 12:24
Giovedì, 19/01/2012
Allora... è tutta la mattina che mi sto incasinando la testa e il risultato è questo: a creare un array grande che mi contenga i vari array di numeri non ci riesco, comunque quello che ho fatto è creare un array di 10 stringhe, in cui ogni stringa contiene i vari numeri (uno per riga) degli array. Ora quindi dovrei fare il confronto di queste stringhe riga per riga, ma prima dovrei convertirli in interi immagino no? Come devo fare? Io ho fatto questo:
Codice sorgente - presumibilmente Java

  1. for(int i=0; i<arrayStringhe.length; i++){
  2.         int numeri = Integer.parseInt(arrayStringhe[i]);
  3.         System.out.println(numeri);
  4. }



L'output mi restituisce tutti i numeri ma anche un NumberFormatException.forInputString .
Se conoscete un metodo più semplice per piacere illuminatemi.

Edit: non ha molto senso convertire numeri in stringa per poi riconvertirli in numeri... quindi se qualcuno mi sa dire come fare l'array grande sarebbe meglio.

Ultima modifica effettuata da mullo il 19/01/2012 alle 14:28
PM Quote
Avatar
subazu (Normal User)
Rookie


Messaggi: 35
Iscritto: 06/08/2011

Segnala al moderatore
Postato alle 15:10
Giovedì, 19/01/2012
Ripeto che non so nulla di Java, cercherò di copiare la sintassi da quello che mi scrivi, devi quindi interpretare il mio codice.
Io partirei dal basso con una funzione che calcola prima la distanza tra 2 interi e poi una funzioncina che calcola la distanza tra un array ed un altro sai?

Function IntDistance (N1,N2:Intero ) : Intero
   Return abs(N1-N2)
End function

Function Distance2Array ( V1,V2:TipoVettore) : Intero
   Int N = 0
   for(int i=0; i<V1.length; i++)
      N = N + IntDistance(V1(i),V2(i))
End function

Ora dobbiamo trovare la distanza tra 3 array quindi SE HO CAPITO BENE è così:

Function Distance3Array ( V1,V2,V3:TipoVettore) : Intero
   Int N = 0
   N = N + Distance2Array(V1,V2)
   N = N + Distance2Array(V2,V3)
   N = N + Distance2Array(V3,V1)
   Return N
End Function

E fino a qui penso sia semplice :-)

Il problema più grande è quello di creare le trie, questo perchè:
con 10 array ci sono 10*9*8 = 720  combinazioni di trie.
es:
1 - 1 2 3
2 - 2 3 1 (si questa è uguale alla prima)
3 - 1 2 4
4 - 3 5 6
5 ... fino a 720 :noway:

Oppure ci sono queste trie:
1 - 123
2 - 234
3 - 345
4 - 456
5 ... fino a 10

E qui non ho capito bene quale tipo di confronti vuoi fare...








PM Quote
Avatar
mullo (Normal User)
Rookie


Messaggi: 37
Iscritto: 16/03/2010

Segnala al moderatore
Postato alle 15:39
Giovedì, 19/01/2012
No, per fortuna il mio caso è più semplice. In pratica devo fare questo:

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.
Se fai il conto AB, AC, AD, etc...  BC, BD, BE, etc... sono 9+8+7+...+1 = 45 combinazioni.

Tieni conto che ogni array mi viene generato all'interno di un ciclo for... come salvo i contenuti di ogni array in modo che poi possa usarli per confrontarli?

PM Quote
Avatar
subazu (Normal User)
Rookie


Messaggi: 35
Iscritto: 06/08/2011

Segnala al moderatore
Postato alle 19:10
Giovedì, 19/01/2012
Ah ok tutto chiaro, pensavo che tu dovessi trovare i 3 array che avessero tra di loro in minor numero di differenze :rotfl:

Bene è tutto molto semplice :)
Invece di usare un array monodimensionale ne usi uno bidimensionale, anche detta matrice o tabella, che non è altro che un Array di Array

int nElementi = 500
int nArray = 10

int data(nElementi)(nAray)

int ressults(sommaNElementi(narray))

int k = 0

for(int i=0; i<nArray ; i++)
   for(int j=i+1; j<nArray ; i++)
      results(k) = Distance2Array (data(i),data(j))
      k = k +1

Ora in results hai il valore di tutti i confronti :idea:
  

Ultima modifica effettuata da subazu il 19/01/2012 alle 20:16
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 10:33
Venerdì, 20/01/2012
Usate i tag CODE per racchiudere il codice. E' così difficile leggere il regolamento?

@subazu: non capisco quanti elementi abbia results. Ci sono alcuni errori nel tuo codice:
Codice sorgente - presumibilmente Java

  1. int nElementi = 500
  2. int nArray = 10
  3.  
  4. int data(nArray)(nElementi)
  5.  
  6. int results(nArray * nArray)
  7.  
  8. int k = 0
  9.  
  10. for(int i = 0; i < nArray - 1; i++)
  11.    for(int j = i + 1; j < nArray; j++)
  12.       results(k) = Distance2Array(data(i),data(j))
  13.       k = k + 1




L'approccio di programmazione dinamica di subazu è corretto. Si può migliorare usando una tecnica branch&bound, dove il bound è la massima differenza tra le tre coppie di array fin'ora trovate con differenze minori.

PM Quote
Avatar
mullo (Normal User)
Rookie


Messaggi: 37
Iscritto: 16/03/2010

Segnala al moderatore
Postato alle 15:34
Venerdì, 20/01/2012
Scusate ma io non ci sto capendo niente...
premetto che questa notazione nel codice neanche la conosco: int data(nArray)(nElementi);
cosa significa quando ci sono le due parentesi vicine? Infatti quella parte mi dà anche degli errori "error: ';' expected"

Comunque vi scrivo parte del codice così capite meglio la struttura:
Codice sorgente - presumibilmente Java

  1. public static void main(String[] args) throws IOException{
  2.         File f = new File("./MiaCartella");
  3.         File[] files = f.listFiles();
  4.         for(int k = 0; k < files.length; k++){
  5.                
  6.                //per ogni file contenuto nella cartella (ne metto 10), questo genera un array MioArray[] di 256 valori
  7.                int[] mioArray = new int[256];
  8.                for(int i=0;i<arrayP.length;i++){
  9.                         mioArray[arrayP[i]]++;
  10.                         arrayP[i] = 0xff000000 | arrayP[i] * 0x10101;
  11.                 }
  12.                
  13.         }
  14. }



Quindi all'esterno del ciclo for() devo salvare questi 10 array e fare i confronti di cui parlavo.

Ultima modifica effettuata da mullo il 20/01/2012 alle 16:28
PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo