skalski.at → files → PJWSTK → UTP → ZAD_1_GENERICS_MAPPER_SELECTOR

UTP 1 - przykładowe rozwiązanie, wymaga przerobienia przed oddaniem!

POBIERZ WSZYSTKIE PLIKI W .ZIP

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)

Colect.java - POKAŻ CZYSTY PLIK

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;
	}
}

Main.java - POKAŻ CZYSTY PLIK

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);
		}
	}
}

MapIntegerDodaj.java - POKAŻ CZYSTY PLIK


// 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;
	}

}

MapStringDlugoscDodaj.java - POKAŻ CZYSTY PLIK


// 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;
	}

}

Mapper.java - POKAŻ CZYSTY PLIK


// interfejs 'mappera' (konwertera?) przyjmujacego elementy typu T i zwracajacy typ S
public interface Mapper<T, S>
{
	public S map(T element);
}

SelInt.java - POKAŻ CZYSTY PLIK


// 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;
	}
}

SelStr.java - POKAŻ CZYSTY PLIK


// 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;
	}
}

Select.java - POKAŻ CZYSTY PLIK


// interfejs filtra elementow typu T
public interface Select<T>
{
	public boolean select(T element);
}