skalski.at → files → PJWSTK → UTP → ZAD_1_GENERICS_MAPPER_SELECTORUTP 1 - przykładowe rozwiązanie, wymaga przerobienia przed oddaniem!
Nie mam treści zadania.
Jedynie je widziałem przez parę minut i napisałem potem z pamięci rozwiązanie które jest podobne do wymaganego rozwiązania.
Na pewno znajdziesz tutaj rozwiązanie wszystkich problemów z 'generics' (jak użyć w metodzie statycznej, jak i gdzie podawać te wszystkie cholerne T i S).
Wolał bym tego nie pisać po jednym roku nauki Javy ;)
Jerzy Skalski (phoowned@wp.pl)
import java.util.ArrayList;
import java.util.List;
public class Colect<T, S>
{
public List<T> lista;
// tworzenie obiektu typu Colect<T, S> zawierajacego w sobie liste elementow typu T
public static <T,S> Colect<T,S> create(List<T> x)
{
Colect<T,S> tmp = new Colect<T,S>();
tmp.lista = x;
return tmp;
}
// usuwanie z listy elementy nie spelniajace wymagan
public Colect<T,S> when(Select<T> x)
{
// usuwam z listy elementy nie przechodzace przez funkcje 'select' z podanego obiektu typu 'Select'
for(int i = 0; i < lista.size(); i++)
{
T element = lista.get(i);
if(!x.select(element))
{
lista.remove(i);
// jesli usuwam 'aktualny' (lub wczesniejszy) element listy to musze zmniejszyc iterator o 1
i--;
}
}
return this;
}
//
public List<S> mapEvery(Mapper<T, S> mapInt)
{
// lista zwracana, inny typ niz przyjmowana (przyjmuje T i zwraca S)
List<S> listaZwracana = new ArrayList<S>();
for(int i = 0; i < lista.size(); i++)
{
// pobieram element listy
T element = lista.get(i);
// modyfikuje jego wartosc uzywajac funkcji 'map' z podanego 'Mapper'a
// przy okazji typ zmienia sie z T na S
S elementZmodyfikowany = mapInt.map(element);
// zapisuje nowa wartosc w miejsce starej na liscie
listaZwracana.add(elementZmodyfikowany);
}
return listaZwracana;
}
}
import java.util.ArrayList;
import java.util.List;
public class Main
{
public static void main(String[] args)
{
// tworze liste typu Integer
List<Integer> x = new ArrayList<Integer>();
x.add(3);
x.add(4);
x.add(7);
x.add(10);
x.add(17);
// usun liczby wieksze od 8
Select<Integer> sel = new SelInt(8);
// generowana lista ma zawierac wartosci powiekszone o 12
Mapper<Integer, Integer> map = new MapIntegerDodaj(12);
// generuje nowa liste - przefiltrowana i zmapowana
List<Integer> result = Colect.<Integer,Integer>create(x).when(sel).mapEvery(map);
for(Integer element : result)
{
System.out.println(element);
}
System.out.println();
System.out.println();
// tworze liste typu String
List<String> y = new ArrayList<String>();
y.add("a");
y.add("bb");
y.add("ccc");
y.add("dddd");
y.add("eeeee");
y.add("ffffff");
// usun slowa dluzsze niz 6 znakow
Select<String> sel2 = new SelStr(6);
// generowana lista ma zawierac INT z dlugoscia wyrazow powiekszona o 13
Mapper<String, Integer> map2 = new MapStringDlugoscDodaj(13);
// generuja nowa liste - przefiltrowana i zmapowana
List<Integer> result2 = Colect.<String, Integer>create(y).when(sel2).mapEvery(map2);
for(Integer element : result2)
{
System.out.println(element);
}
}
}
// klasa 'mapujaca' INT na INT przy okazji zmieniajac wartosc
public class MapIntegerDodaj implements Mapper<Integer, Integer>
{
private int ileDodacDoIntegera;
public MapIntegerDodaj(int ileDodacDoIntegera)
{
this.ileDodacDoIntegera = ileDodacDoIntegera;
}
@Override
public Integer map(Integer element)
{
return element + this.ileDodacDoIntegera;
}
}
// klasa 'mapujaca' STRING na INT, zwraca ilosc znakow w danym STRING powiekszona o okreslona wartosc
public class MapStringDlugoscDodaj implements Mapper<String, Integer>
{
private int ileDodacDoDlugosci;
public MapStringDlugoscDodaj(int ileDodacDoDlugosci)
{
this.ileDodacDoDlugosci = ileDodacDoDlugosci;
}
@Override
public Integer map(String element)
{
return element.length() + this.ileDodacDoDlugosci;
}
}
// interfejs 'mappera' (konwertera?) przyjmujacego elementy typu T i zwracajacy typ S
public interface Mapper<T, S>
{
public S map(T element);
}
// klasa filtrujaca elementy INT ktore sa za duze
public class SelInt implements Select<Integer>
{
private int maxNumber;
public SelInt(int maxNumber)
{
this.maxNumber = maxNumber;
}
@Override
public boolean select(Integer element)
{
return element < this.maxNumber;
}
}
// klasa filtrujaca elementy STRING ktore sa za dlugie
public class SelStr implements Select<String>
{
private int maxLength;
public SelStr(int maxLength)
{
this.maxLength = maxLength;
}
@Override
public boolean select(String element)
{
return element.length() <= this.maxLength;
}
}
// interfejs filtra elementow typu T
public interface Select<T>
{
public boolean select(T element);
}