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

    Esercizio Java: rimozione duplicati in un Array

    Ciao ragazzi, avrei bisogno di un aiuto con un esercizio (sono ancora un super novellino in Java)
    in pratica ho un Array char e devo creare un metodo che restituisca un nuovo Array, con gli stessi valori del precedente, ma senza i duplicati. l'esercizio suggerisce di utilizzare un Array booleano per tenere traccia dei caratteri da mantenere così da determinare la lunghezza del nuovo Array. Sulla base di ciò e sperando di aver compreso il "suggerimento" ho proceduto come segue:

    codice:
    public class noDuplicati {
    
    
        public static void main(String[] args) {
            
            char[] carattere = {'a','b','a','c','c','b'};
            int count = 0;
            boolean[] bArray = {true,true,true,true,true,true};
            
            for(int i = 0; i < carattere.length - 1; i++) {
                int j = i + 1;
                int n = j;
                for(j = n; j < carattere.length; j++) {
                    if(carattere[i] == carattere[j]) {
                        bArray[j] = false;
                        
                    }
                }
                
            }
            
            for(int i = 0; i < bArray.length; i++) {
                
                if(bArray[i] == true) {
                    count++;
                }
                
            }
            
            char[] nuovoArray = rimuoviDuplicati(carattere, bArray, count);
            System.out.print(nuovoArray);
        }
        
        public static char[] rimuoviDuplicati(char[] unArray, boolean[] altroArray, int lunghezzaArray) {
            
            int count = lunghezzaArray;
            char[] nuovoArray = new char[count];
            
            //CODICE PER RIEMPIRE IL NUOVO ARRAY
                
                
            }
            
            return nuovoArray;
                
            }
            
            
        }

    Ho provveduto ad assegnare i valori false all'Array ogni volta che trova un duplicato, quindi nel caso sopra l'array booleano diventa: {true, true, false, true, false, false} restituendo 4 come lunghezza per il nuovo array.
    Ma adesso mi sono bloccato e non so come riempire il nuovo Array.

    Vi ringrazio e perdonatemi ancora se ci sono grossi errori o buchi

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Angelo82 Visualizza il messaggio
    in pratica ho un Array char e devo creare un metodo che restituisca un nuovo Array, con gli stessi valori del precedente, ma senza i duplicati. l'esercizio suggerisce di utilizzare un Array booleano per tenere traccia dei caratteri da mantenere così da determinare la lunghezza del nuovo Array.
    Sì, ok l'array di boolean. Ma per fare le cose davvero "bene", il tuo metodo rimuoviDuplicati dovrebbe essere:

    public static char[] rimuoviDuplicati(char[] unArray)

    Cioè, non serve passare un array di boolean, né una lunghezza. Tutti questi "ragionamenti" dovrebbero essere dentro il rimuoviDuplicati.

    Quindi, DENTRO rimuoviDuplicati:

    1) crei un array di boolean della stessa lunghezza di unArray. I valori inizialmente sono tutti false, questo va bene.
    2) fai un doppio for annidato con la logica per trovare i duplicati. Appena trovi un duplicato, metti il corrispondente boolean a true. Se iterando trovi un boolean già a true, non devi andare a cercare il char in avanti (perché quello è già un duplicato!).
    3) conti quanti boolean sono a false (sai quanto dimensionare il nuovo array)
    4) copi i valori con false corrispondente nel nuovo array.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Ah capisco, in effetti ero consapevole che il mio "metodo" fosse un leggero "accrocco", cosa su cui devo migliorare sicuramente
    Comunque credo di aver compreso il ragionamento, che metterò subito in pratica.
    Grazie infinite per la tua risposta ed il tuo aiuto

  4. #4
    codice:
    public static char[] rimuoviDuplicati(char[] unArray) {		
    		boolean[] bArray = new boolean[unArray.length];
    		
    		for(int i = 0; i < unArray.length - 1; i++) {
    			int j = i + 1;
    			int n = j;
    			for(j = n; j < unArray.length; j++) {
    				if(unArray[i] == unArray[j]) {
    					bArray[j] = true;
    					
    				}
    			}
    			
    		}
    		
    		int count = 0;
    		
    		for(int i = 0; i < bArray.length; i++) {
    			
    			if(bArray[i] == false) {
    				count++;
    			}
    			
    		}
    		char[] temp = new char[count];
    		
    		//codice per riempire il nuovo Array
    		
    		return temp;
    			
    		}
    Ho dato una "sistemata" al metodo rimuoviDuplicati. il quale scova tutti i duplicati e assegna il valore "true" per ogni duplicato trovato.
    Quindi nel caso sopra, l'array booleano diventa: {false, false,true,false,true true} il che è giusto

    vengono contati quanti false ci sono (3) e da questi ho la dimensione del nuovo array. Unica cosa che (se il procedimento sopra è corretto) mi resta da fare è riempire il nuovo array.. ma per farlo che logica devo usare? Nel senso, quale/i array devo scorrere? Avevo pensato una maniera simile ma non funziona:
    codice:
    for(int k = 0; k < bArray.length; k++) {
    			
    			if(bArray[k] == false) {
    				for(int j = 0; j < temp.length; j++) {
    					temp[j] = unArray[k];
    				}
    			}
    			
    		}
    Grazie ancora per la disponibilità

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Angelo82 Visualizza il messaggio
    codice:
    		boolean[] bArray = new boolean[unArray.length];
    Ok

    Quote Originariamente inviata da Angelo82 Visualizza il messaggio
    codice:
    		
    		for(int i = 0; i < unArray.length - 1; i++) {
    			int j = i + 1;
    			int n = j;
    			for(j = n; j < unArray.length; j++) {
    				if(unArray[i] == unArray[j]) {
    					bArray[j] = true;
    					
    				}
    			}
    		}
    Di per sé mi pare funzionalmente corretto ma ...

    1) fai "giri" inutili con le variabili (guarda bene ...)
    2) è ottimizzabile, il ciclo interno puoi NON farlo se bArray[i] è già a true (perché vuol dire che quel valore l'avevi già beccato in precedenza)

    Quote Originariamente inviata da Angelo82 Visualizza il messaggio
    codice:
    	
    		int count = 0;
    		
    		for(int i = 0; i < bArray.length; i++) {
    			
    			if(bArray[i] == false) {
    				count++;
    			}
    			
    		}
    		char[] temp = new char[count];
    Corretto

    Quote Originariamente inviata da Angelo82 Visualizza il messaggio
    Unica cosa che (se il procedimento sopra è corretto) mi resta da fare è riempire il nuovo array.. ma per farlo che logica devo usare? Nel senso, quale/i array devo scorrere?
    Basta un banale ciclo for ma .... servono 2 indici: uno è quello "lineare" nel nuovo array (che tu hai chiamato temp), l'altro è quello nell'array originale, dove però prendi solo i valori con il corrispondente false.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Grazie infinite per il tuo aiuto ed i tuoi suggerimenti, che metterò in pratica per ottimizzare ogni parte del codice

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.