import java.util.List;
import java.util.Iterator;
import java.util.HashSet;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Collections;
class Bin implements BinInterface{
List<Garbage> lista = new ArrayList<Garbage>();
HashSet<Garbage> set = new HashSet<Garbage>(lista);
List<Garbage> lista2 = new ArrayList<Garbage>(set);
List<Glass> glass= new ArrayList<Glass>();
List<Recyclable> recyclable = new ArrayList<Recyclable>();
List<Radioactive> radioactive = new ArrayList<Radioactive>();
public <T extends Garbage> void toBin( T sth ){
lista.add(sth);
}
public List<Garbage> getSorted( WasteType wt ){
switch(wt){
case RECYCLABLE:
lista2.clear();
for ( Garbage g : lista ) {
if ( g.getWasteType() == wt)
recyclable.add((Recyclable)g);
}
Collections.sort(recyclable, new Sort_Recyclable());
lista2.addAll(recyclable);
break;
case GLASS:
lista2.clear();
for ( Garbage g : lista ) {
if ( g.getWasteType() == wt )
glass.add((Glass)g);
}
//glass.forEach(e->System.out.println(e));
Collections.sort(glass, new Sort_Glass());
for(Glass g : glass)
lista2.add(g);
break;
case RADIOACTIVE:
lista2.clear();
for ( Garbage g : lista ) {
if ( g.getWasteType() == wt )
radioactive.add((Radioactive)g);
}
Collections.sort(radioactive, new Sort_Radioactive());
lista2.addAll(radioactive);
break;
}
//lista.clear();
//lista=glass;
//lista2.forEach(e->System.out.println(e));
return lista2;
}
}
class Sort_Glass implements Comparator<Garbage>
{
public int compare(Garbage x,Garbage y)
{
double obj1=((Glass)x).getVolume();
double obj2=((Glass)y).getVolume();
if(obj1<obj2) return 1;
if(obj1>obj2) return -1;
else return 0;
}
}
class Sort_Recyclable implements Comparator<Garbage>
{
public int compare(Garbage x,Garbage y)
{
double obj1=((Recyclable)x).getWeight();
double obj2=((Recyclable)y).getWeight();
if(obj1<obj2) return 1;
if(obj1>obj2) return -1;
else return 0;
}
}
class Sort_Radioactive implements Comparator<Garbage>
{
public int compare(Garbage x,Garbage y)
{
double obj1=((Radioactive)x).getRadiativeFlux();
double obj2=((Radioactive)y).getRadiativeFlux();
if(obj1<obj2) return 1;
if(obj1>obj2) return -1;
else return 0;
}
}