|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Feb 2003
Città: Thessaloniki
Messaggi: 2214
|
Java: Eliminare duplicati dall'array...
Ciao raggazzi (e ciao PGI
import java.util.Arrays; public class SortArray { public static void main (String [] args) { int [] array = new int [10]; int arraySize = array.length; array[0] = 4; array[1] = 7; array[2] = 11; array[3] = 4; array[4] = 9; array[5] = 5; array[6] = 11; array[7] = 7; array[8] = 3; array[9] = 5; System.out.println ("Array iniziale"); for (int i=0; i<array.length; i++) System.out.println (array[i]); //array non sortato Arrays.sort(array); //array sortato System.out.println ("\nArray ordinato"); for (int i=0; i<array.length; i++) System.out.println(array[i]); //qui comincia l'algoritmo che controlla l'array for (int i=0; i<=arraySize; i++) { if (array[i] != array[i+1]) { //System.out.println (array[i]); arraySize--; } else { int pos = i; for (int x=pos; x<arraySize; x++) // System.out.println(array[i]); { array[x] = array [x+1]; // System.out.println (array[x]); pos++; } arraySize--; } } System.out.print ("\nArray finale"); for (int i=0; i<array.length-arraySize; i++) System.out.print ("\n" + array[i]); } } Il problema mi si presenta con l'ultimo elemento. Infatti se si lascia l'array cosi' com'e' (con i due 11 finali) funziona, ma se cambio uno dei due 11 in un altro numero piu' grande non funziona dandomi sempre come ultimo elemento l'11. Ho provato anche a cambiare nell'ultimo for il i<array.length-arraySize e farlo i<=array.length-arraySize che poi funziona con ultimi elementi un 11 e un 12 ma non funziona con due 11. Infatti in questo caso mi stampa pure anche il secondo 11. Mi spiace per la lunga spiegazione ma e' un problema un po' bastardo. Grazie a chi rispondera' riguardo a questo problema ma anche a chi mi da qualche dritta per migliorare il mio modo pessimo di programmare. Ciaoooo |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
lascio a chi ha piu' buona volontà la lettura del tuo codice, volevo solo farti notare che nel package java.util, oltre agli oggetto che implementano l'interfaccia List ci sono quelli che implementano Set che hanno la caratteristica di non permettere duplicati
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jul 1999
Città: Torino
Messaggi: 2221
|
COsa intendi per eliminare l'array?? Come una qualunque variable, bisogna accorgersi quando non serve più e farlo puntare a null.
array = null; In questo modo il GarbageCollector può ripulire la zona di memoria contenente gli elementi dell'array. Fino a che c'è un riferimento ad essa, tale zona non verrà ripulita. |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19148
|
forse non sarebbe male implementare un algoritmo di ordinamento che elimini da subito i duplicati.
non so però se si tratta di una cosa molto semplice... |
|
|
|
|
|
#5 |
|
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
Versione corta.
Ci sono due cose che non vanno in quel programma. La prima è che diminuisci le dimensioni dell'"array" finale sia che incontri due numeri diversi sia che siano uguali. Il che significa che stampi sempre e comunque metà dell'array (ecco perchè quando cambi il ciclo di stampa da < a <= stampa sempre un numero in più, sia 11 che 12). Quindi nel primo if(diversi) va tolto quell'"arraySize--". Il secondo è un equivoco: in un ciclo "for" la base (int x=pos) viene calcolata solo all'inizio, poi "pos" non viene più considerato. "pos++" non ha alcun effetto. La versione "funzionante" è per il primo if: Codice:
if (array[i] != array[i+1])
{
//niente, questo if si può anche eliminare
}
Codice:
else
{
int pos = i;
arraySize--;
for (int x=pos; x<arraySize; x++)
{
array[x] = array [x+1];
//pos++;
}
}
A questo punto puoi togliere il primo if ed eliminare "int pos=i" sostituendo semplicemente pos con i. Ciao. PS: aggiungo per chiarezza il codice completo modificato come sopra Codice:
import java.util.Arrays;
public class SortArray
{
public static void main (String [] args)
{
int [] array = new int [10];
int arraySize = array.length;
array[0] = 4;
array[1] = 7;
array[2] = 11;
array[3] = 4;
array[4] = 9;
array[5] = 5;
array[6] = 11;
array[7] = 7;
array[8] = 3;
array[9] = 5;
System.out.println ("Array iniziale");
for (int i=0; i<array.length; i++)
System.out.println (array[i]); //array non sortato
Arrays.sort(array); //array sortato
System.out.println ("\nArray ordinato");
for (int i=0; i<array.length; i++)
System.out.println(array[i]);
//qui comincia l'algoritmo che controlla l'array
for (int i=0; i<=arraySize; i++)
{
if (array[i] != array[i+1])
{
//System.out.println (array[i]);
//arraySize--;
}
else
{
int pos = i;
arraySize--;
//System.out.println("Size: "+arraySize);
for (int x=pos; x<arraySize; x++)
// System.out.println(array[i]);
{
array[x] = array [x+1];
// System.out.println (array[x]);
//pos++;
}
}
}
System.out.print ("\nArray finale");
for (int i=0; i<=arraySize; i++)
System.out.print ("\n" + array[i]);
}
}
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Feb 2003
Città: Thessaloniki
Messaggi: 2214
|
FUNZIONA!!!
![]() Ragazzi vi voglio ringraziare tutti quanti per aver avuto la pazienza ad aiutarmi. Un grazie davvero grandissimo a PGI (sei bravissimo nonche una persona davvero disponibilissima. E' un piacere trovare delle persone cosi' che pur essendo di livello avanzato aiutano sempre noi novellini). Ti ringrazio di tutte le spiegazioni e della tua disponibilita'
|
|
|
|
|
|
#7 |
|
Bannato
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
|
Ohè, mi fai sentire il "Papa buono" della programmazione!
Fa piacere essere utili. Ciao. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:27.




















