avevo come esercizio quello di costruire un crivello di eratostene. ok, ci sono sul crivello.
dovevo crearlo con TreeSet, LinkedList e ArrayList.
Il TreeSet va tutto bene, stampa e procede come avevo in mente:
codice:
package eratostene;

import java.util.*;


public class CrivelloSet extends CrivelloAstratto{
	private Set<Integer> crivello=new LinkedHashSet<Integer>();
	private Set<Integer> primi=new LinkedHashSet<Integer>();
	private final int N;
	
	public CrivelloSet(int N){
		if(N<2)
			throw new RuntimeException("N minore di 2");
		this.N=N;
		for(int i=2; i<=N; i++)
			crivello.add(i);
	}
	
	public int size(){
		return primi.size();
	}
	
	public void filtra(){
		while(!crivello.isEmpty()){
			//estrazione del minimo crivello
			int minimo=crivello.iterator().next();
			primi.add(minimo);
			//eliminazione del minimo e dei suoi multipli
			int multiplo=minimo;
			while(multiplo<=N){
				crivello.remove(multiplo);
				multiplo=multiplo+minimo;
			}
		}
	}
	
	public Iterator<Integer> iterator(){
		return primi.iterator();
	}
	
	public static void main(String[]args){
		CrivelloSet cE=new CrivelloSet(1000);
		cE.filtra();
		System.out.println(cE);
	}
}
AL e LL non stampano nulla, vuoto:

LL
codice:
package eratostene;
import java.util.*;


public class CrivelloLL extends CrivelloAstratto{
	private LinkedList<Integer> crivello=new LinkedList<Integer>();
	private LinkedList<Integer> primi=new LinkedList<Integer>();
	private final int N;
	
	public CrivelloLL(int N){
		if(N<2)
			throw new RuntimeException("N minore di 2");
		this.N=N;
		for(int i=0; i<=N; i++)
			crivello.add(i);
	}
	
	public int size(){ 
		return crivello.size();
	}
	
	public void filtra(){
		while(!(crivello.isEmpty())){
			int minimo=crivello.listIterator().next();
			primi.add(minimo);
			int multiplo=minimo;
			while(multiplo<=N){
				crivello.remove(new Integer(multiplo));
				multiplo=multiplo+minimo;
			}
		}
	}
	
	public ListIterator<Integer> listiterator(){
		return crivello.listIterator();
	}
	
	public static void main(String[]args){
		Crivello cE=new CrivelloLL(1000);
		cE.filtra();
		System.out.println(cE);
	}


	@Override
	public Iterator<Integer> iterator() {
		// TODO Auto-generated method stub
		return null;
	}


}
AL
codice:
public CrivelloAL(int N){
		if(N<2)
			throw new RuntimeException("N minore di 2");
		this.N=N;
		for(int i=0; i<=N; i++)
			crivello.add(i);
	}
	
	public int size(){ 
		return crivello.size();
	}
	
	public void filtra(){
		while(!crivello.isEmpty()){
			int minimo=crivello.iterator().next();
			primi.add(minimo);
			int multiplo=minimo;
			while(multiplo<=N){
				crivello.remove(new Integer(multiplo));
				multiplo=multiplo+minimo;
			}
		}
	}
	
	public Iterator<Integer> iterator(){
		return primi.iterator();
	}
	
	public static void main(String[]args){
		Crivello cE=new CrivelloAL(1000);
		cE.filtra();
		System.out.println(cE);
	}


}
DOMANDE:

perchè se faccio:
codice:
crivello.remove(multiplo);
da errore? Esiste il metodo
codice:
Object remove(int index)
quindi perchè da errore?
a questo punto non potrei fare:
codice:
primi.add(crivello.remove(multiplo));
? poichè la remove restitusce proprio l'oggetto relativo all'indice..

comunque il criterio è semplice, sposto i primi su un AL o LL primi togliendoli da un AL o LL crivello.