Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [java] Eliminare doppioni di un array

    Salve a tutti, sto impazzendo su un problema che non riesco a risolvere!
    Mi spiego:
    Ho un Array fissato a 1000 elementi contenente degli oggetti (episodi di serial tv) prelevati da un file di testo.Sto creando un metodo che mi elimini gli episodi che compaiono più di una volta all'interno dei questo array, ma ovviamente non funziona, posto ciò che ho già fatto.
    codice:
    public void squeeze() {
    	Episode [] clean = new Episode[1000]; //array buffer in cui salvo gli episodi
    	int clean_index = 0; //indice che mi indica in che posizione sto inserendo l'episodio
    	
                //getCount ritorna la posizione dell'ultimo elemento contenuto nell'arrau principale della
                //classe popolato con il file di testo
    	for(int i = 0; i < this.getCount(); i++) {
    		Episode e = this.episodes[i]; //episodes è l'array principale da cui devo togliere i doppi
    		boolean esiste = false;
    		
                        //riscorro l'array in cerca dei doppioni
                        for(int j = 0; j < this.getCount() && !esiste; j++) {
    			if(i != j) {
    				if(e.getTitle().equals(this.episodes[j].getTitle())) {
    					esiste = true;
    				}
    			}
    		}
    		
    		//se non ho trovato nulla, l'aggiungo
    		if(!esiste) clean[clean_index ++] = e;
    	}
    
                //sostituisco l'array principale con quello appena creato senza doppioni
    	this.episodes = clean;
    	this.nepisodes = clean_index; //nuovo top dell'array
    }
    la ricerca del doppione avviene comparando alcuni parametri dell'episodio; nell'esempio ho messo solo il titolo (e.getTitle()) per semplicità.
    Il problema di questo mio metodo è che mi elimina del tutto i doppioni, quando a me servirebbe tenerne ovviamente almeno uno nell'array, per esempio, dati due episodi:
    codice:
    Lost|Exposé|3|2007|63|Drama
    Lost|exposé |3|2007|63|Drama
    Io dovrei eliminare il suo doppio dall'array lasciandone solo uno (il mio metodo li elimina tutti e due invece)
    Ci sto impazzendo, cosa sbaglio?Qualcuno potrebbe aiutarmi?
    Grazie mille in anticipo!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [java] Eliminare doppioni di un array

    Originariamente inviato da -MaVeRiK86-
    Io dovrei eliminare il suo doppio dall'array lasciandone solo uno (il mio metodo li elimina tutti e due invece)
    Ci sto impazzendo, cosa sbaglio?Qualcuno potrebbe aiutarmi?
    Si può risolvere in diversi modi.

    Un modo è ordinare l'array secondo un ordinamento tale per cui eventuali "doppioni" si posizionano in sequenza. A quel punto basta una sola scansione dell'array, dal secondo "doppione" in poi che trovi che è uguale al primo, lo elimini "virtualmente" giocando sugli indici in modo che gli episodi successivi vengano assegnati a indici inferiori.

    Altro modo è usare un "set", ovvero una collezione che non ammette duplicati. Qui però la "uguaglianza" dovrebbe basarsi su equals(). E tra l'altro non sarebbe male definire l'equals() in modo da semplificarti la vita. Quando 2 episode sono "uguali"?? A rigor di logica, dovrebbe bastare quando hanno serial e titolo uguale.

    Oppure ancora fare il doppio for innestato, come stavi facendo. Ma non così. Innanzitutto hai fatto partire il for interno da 0 e poi "salti" l'elemento se è allo stesso indice. Ma se ci pensi, non c'è bisogno di partire da più indietro.


    Esempio con le stringhe:

    codice:
    public class Prova {
        public static void main(String[] args) {
            String[] arr = { "ciao", "pippo", "pluto", "ciao", "hello", "ciao", "pippo" };
            int logicalSize = arr.length;
    
            for (int i = 0; i < logicalSize; i++) {
                String elem = arr[i];
    
                int s = logicalSize;
    
                for (int j = i+1, w = j; j < s; j++) {
                    if (elem.equals(arr[j])) {
                        logicalSize--;
                    } else {
                        arr[w++] = arr[j];
                    }
                }
            }
    
            for (int i = 0; i < logicalSize; i++) {
                System.out.println(arr[i]);
            }
        }
    }
    C'è una cosa che non ho fatto: annullare i reference al fondo. All'inizio la dimensione logica è 7, alla fine restano 4. Gli ultimi 3 andrebbero annullati, specialmente se, come nel tuo caso, hai oggetti complessi. Basta tenersi la dimensione iniziale e poi fare un ciclo for finale.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Opto per i due for annidati, mi sembra la soluzione più adatta alla mia portata!
    Grazie mille per l'aiuto, gentilissimo!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.