Vai al contenuto

[Java] Crivello di Eratostene, aiutatemi a risolvere l'errore [Risolto]


AR89

Messaggi raccomandati

Ho creata il seguente codice, che serve, dati i primi n numeri, a trovare quali sono quelli primi fra di essi.

import java.util.*;
public class CrivelloDiEratostene {
private Set<Integer> crivello= new HashSet<Integer>();
private int n;
public CrivelloDiEratostene (int n) {
	if (n<2) throw new IllegalArgumentException();
	this.n=n;
	for (int i=2; i<=n; i++)
		crivello.add(i);
}//costruttore
public void filtra(){
	for(int i=2; i<Math.round(Math.sqrt(n)); i= (i==2)? i+1 : i+2)
		if (crivello.contains(i))
			for (int j=2*i; j<= n; j+=i)
				crivello.remove(j);
}//filtra
public String toString(){
	TreeSet ts= new TreeSet(crivello);
	int conta=0, quanti=8;
	StringBuilder sb= new StringBuilder(1000);
	Iterator<Integer> it= ts.iterator();
	while (it.hasNext()){
		int x=it.next();
		sb.append(String.format("%8d", x));
		conta++;
		if (conta%quanti==0)
			sb.append('\n');
	}//while
	return sb.toString();
}//toString
public static void main(String[] args) {
	CrivelloDiEratostene c= new CrivelloDiEratostene(1000);
	c.filtra();
	System.out.println(c);
}//main
}

Quando cerco di compilarlo mi dà il seguente errore:

Note: poo/crivello/CrivelloDiEratostene.java uses unchecked or unsafe operations.

Note: Recompile with -Xlint:unchecked for details.

È un errore che non avevo mai visto, cosa significa? Se Java su Mac è aggiornata alla 1.5, significa che dovrebbe supportare l'autoboxing e l'autounboxing (se questo è il problema).

Un Tetris in vecchio stile, dedicato alla versione per Mac degli anni 80.

Link al commento
Condividi su altri siti

Ciao AR89

ora non riesco a dare un'occhiata al tuo codice, se ti serve qualcosa di funzionante immediatamente di mando il link della pagina di wikipedia che ne parla è c'è un elegante implementazione dell'algoritmo.

Cmq Appena posso cercherò di dare un'occhiata al tuo codice per verificare se ci sono eventuali errori.

Sulla macchina unix che uso ho solo java 1.4.2 e il tuo codice non funziona provvederò a farlo sulla mia macchina fuori dal lavoro quando ho un momentino di tempo.

Buon coding!!!!

tecnologicamente dipendente

Link al commento
Condividi su altri siti

Ciao AR89

ora non riesco a dare un'occhiata al tuo codice, se ti serve qualcosa di funzionante immediatamente di mando il link della pagina di wikipedia che ne parla è c'è un elegante implementazione dell'algoritmo.

Cmq Appena posso cercherò di dare un'occhiata al tuo codice per verificare se ci sono eventuali errori.

Sulla macchina unix che uso ho solo java 1.4.2 e il tuo codice non funziona provvederò a farlo sulla mia macchina fuori dal lavoro quando ho un momentino di tempo.

Buon coding!!!!

Grazie per la disponibiità:oops:

Il codice che ho scritto non può funzionare con la 1.4.2, dvi avee almeno la 1.5 perché sfrutta l'unboxing e il boxing (in pratica fa il casting in automatico). Ho visto l'agoritmo su wikipedia e funziona correttamente, tuttavia il codice che ho fatto mi serve come eserctazione, perché devo capire i meccanismi dell'HashSet e del TreeSet.

Un Tetris in vecchio stile, dedicato alla versione per Mac degli anni 80.

Link al commento
Condividi su altri siti

Complimenti ... ottimo approccio per apprendere il linguaggio

È il solo metodo che conosca per riuscire ad imparare.

Sei riuscito a capire cosa significhi quell'errore? Credo che per risolverlo per prima cosa si dovrebbe vedere come funziona il codice su una macchina con Java 1.5

Un Tetris in vecchio stile, dedicato alla versione per Mac degli anni 80.

Link al commento
Condividi su altri siti

Ciao ...

ho provato questa mattina a far girare il tuo codice, e ho comparato i risultati con l'algoritmo che ti avevo linkato nel mio post quello preso da wikipedia

i risultati che produce sono gli stessi. Per quanto riguarda il problema segnalato nel tuo post forse ho un'idea ma non sono sicuro. Ti mando il codice da me modificato

import java.util.*;
public class CrivelloDiEratostene {
   private Set<Integer> crivello= new HashSet<Integer>();
   private int n;
   public CrivelloDiEratostene (int n) {
       if (n<2) throw new IllegalArgumentException();
       this.n=n;
       for (int i=2; i<=n; i++)
           crivello.add([color="Red"]new Integer(i)[/color]);
   }//costruttore

   public void filtra(){
       for(int i=2; i<Math.round(Math.sqrt(n)); i= (i==2)? i+1 : i+2)
           if (crivello.contains([color="Red"]new Integer(i)[/color]))
               for (int j=2*i; j<= n; j+=i)
                   crivello.remove(j);
   }//filtra

   public String toString(){
       TreeSet ts= new TreeSet(crivello);
       int conta=0, quanti=8;
       StringBuilder sb= new StringBuilder(1000);
       Iterator<Integer> it= ts.iterator();
       while (it.hasNext()){
           int x=it.next();
           sb.append(String.format("%8d", x));
           conta++;
           if (conta%quanti==0)
               sb.append('\n');
       }//while
       return sb.toString();
   }//toString
   public static void main(String[] args) {
       CrivelloDiEratostene c= new CrivelloDiEratostene(1000);
       c.filtra();
       System.out.println(c);
   }//main
}

Ti ho evidenziato in rosso le uniche modifiche che ho fatto!!!

Come puoi vedere alle struttura HashSet che hai creato non passo un elemento semplice ma un oggetto Integer come richiesto dalla tua dichiarazione

private Set<Integer> crivello

tecnologicamente dipendente

Link al commento
Condividi su altri siti

Sono riuscito a risolvere anch'io ma in modo diverso. In realtà il compilatore non mi segnalava un errore!

host31-135-dynamic:/ antonioruffolo$ javac poo/crivello/CrivelloDiEratostene.java

Note: poo/crivello/CrivelloDiEratostene.java uses unchecked or unsafe operations.

Note: Recompile with -Xlint:unchecked for details.

Le due "Note", sono due semplici avvisi, io credevo che si trattasse di un errore e quindi non ho provato a eseguire il codice, per caso oggi ho provato a eseguirlo e funziona perfettamente, non c'è bisogno di nessuna modifica!

Probabilmente quelle due note servono a ricordarti che quel codice potrebbe non funzionare con tutte le JVT.

Se hai un computer con java alla versione 1.5 o superiore, prova a compilare e a eseguire normalmente il codice che ho scritto senza nessuna modifica, dovrebbe funzionare normalmente!

Quello che tu hai evidenziato in rosso è quello che va fatto con una versione precedente alla 1.5, dalla 1.5 in poi capisce automaticamente che gli sto passando un oggetto, quindi non c'è bisogno di scrivere "new Integer(i)". Spero di essere stato chiaro :ciao:

Grazie lo stesso per l'aiuto!

Un Tetris in vecchio stile, dedicato alla versione per Mac degli anni 80.

Link al commento
Condividi su altri siti

Archiviato

Questa discussione è archiviata e chiusa a future risposte.

×
×
  • Crea Nuovo...