Visualizzazione dei risultati da 1 a 7 su 7

Discussione: Set<> ed HashSet<>

  1. #1
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    108

    Set<> ed HashSet<>

    Ragazzi ho questo problema con Set ed HashSet.
    Preaticamente devo risolvere il Crivello di Eratostene che di per sč č molto semplice ma lo devo fare usando Set ed HashSet, nel senso che devo usare i metodi add e remove.
    La classe č questa:
    codice:
    public class Eratostene2{
        
        public static void main(String [] args) {
    
    	Scanner in = new Scanner(System.in);
    	int n = in.nextInt(); // si assume n>=2
    
    
     // costruisco insieme  setPrimi = {2,...,n}
    
    	Set<Integer> setPrimi = new  HashSet<Integer> ();
    	for(int k=2 ; k <=n ; k++){
    	    setPrimi.add(new Integer(k));
    	}
    /*	
    	Iterator<Integer> it = setPrimi.iterator();
    	
    	while(it.hasNext()){
    		Integer x = it.next();
    		int i=2;
    		if((x%i)==0 || (x%3)==0 || (x%5)==0)
    			it.remove();
    	}
    */	
    // per ogni k in setPrimi, tolgo da setPrimi i multipli m di k tali che m < k <= n
    // RIGA 71
    	for(Integer k : setPrimi){
    	    for(int m = 2*k ; m <= n ; m += k)  
    	         setPrimi.remove(new Integer(m));
    	}
    
     // in  setPrimi sono rimasti solamente i numeri primi p tali che 2 <= p <= n 
    
    	for(Integer p : setPrimi)
    	    System.out.print(p + " " );
    	
    	System.out.println();
    
        } // end main
    } // end class
    e mi da questo errore
    codice:
    Exception in thread "main" java.util.ConcurrentModificationException
    	at java.util.HashMap$HashIterator.nextEntry(Unknown Source)
    	at java.util.HashMap$KeyIterator.next(Unknown Source)
    	at Eratostene2.main(Eratostene2.java:71)
    come vedete, nel codice commentato, ho anche provato ad usare Iterator ma mi toglie i numeri fino ad un certo punto e poi sballa...
    dov'č l'errore??

  2. #2
    codice:
    	for(Integer k : setPrimi){
    	    for(int m = 2*k ; m <= n ; m += k)  
    	         setPrimi.remove(new Integer(m));
    	}
    In questo codice elimini un elemento del Set mentre stai scorrendo il set. Questo non puoi farlo.
    Per risolvere puoi fare una copia del Set ed usarne una per scorrere gli elementi e su una fai il remove.
    lolide
    Java Programmer

    Informati

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Specificare il new Integer() č inutile comunque; l'autoboxing fa in automatico.

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    108
    non ho capito bene quello che intendi di fare una copia anche perchč non rimane lo stesso il problema??
    Non č che forse non bisogna iterare il Set con il for e quindi cambiare modo?? Io ho provato con l'Itarator come č scritto nel codice ma nn mi restituisce quello che voglio o forse l'ho implementato male.

  5. #5
    Originariamente inviato da GianniMal
    non ho capito bene quello che intendi di fare una copia anche perchč non rimane lo stesso il problema??
    Invece si risolve. In alternativa puoi usare il metodo toArray.
    codice:
            Integer numbers = setPrimi.toArray(new Integer[0]);
    	for(Integer k : numbers){
    	    for(int m = 2*k ; m <= n ; m += k)  
    	         setPrimi.remove( m );
    	}

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    la copia si intende che tu scorri il set (in generale una collection) e quando trovi l'elemento da rimuovere, fai la remove sull'altro.

    se hai un iteratore, non puoi modificarlo (eliminare elementi) mentre lo scorri, č come se mettessi un lock temporaneo sulla risorsa.
    La soluzione di Vincenzo ti pone nella situazione di avere una copia, ma ti elimina il problema del fare la copia semplicemente prendendo la stessa struttura e trasformandola in array. Come vedi scorri l'array e elimini dalla struttura (cosa che faresti scorrendo la copia e eliminando dalla struttura)

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    108
    Grazie mille per le risposte ho risolto

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.