Pole, generické datové typy, List


Materiály

Pole

Základní použítí pole známe již z prvního semináře. Pro pripomenutí:
    
        int[] cisla = new int[100]; // Deklarace pole o velikosti 100.

        System.out.print(cisla[3]); // Přístup ke třetímu prvku.

    

S poli lze provádět mnohem více operací. Pole můžeme třídit, kopírovat a vypisovat. Vše je dostupné v balíčku java.util.Arrays;.

    
        import java.util.Arrays;

        // Setřízení pole
        int[] numbers = {1,4,6,3,2,7,9,5,3};
        Arrays.sort(numbers);
        Arrays.parallelSort(numbers) // Paralelní třídění, které je dostupné od Javy 8.

        // Výpis pole
        System.out.print(Arrays.toString(numbers));
        // Existuje verze deepToString která převede na String i objekty obsažene v poli.


        // Kopírování pole
        int[] arrayCopy = Arrays.copyOfRange(numbers, 0, 4); // Zkopíruje první 4 prvky
        System.out.println(Arrays.toString(arrayCopy)); // [1, 2, 3, 3]
    

Pokud u metody Arrays.copyOfRange zvolíme konečný index vetší než je délka kopirovaného pole tak tyto prvky budou nahrazeny 0. V Javě lze definovat i vícerozměrná pole. Oproti jazyku C není nutné mít všechny řádky stejně dlouhé.

    
        String[][] names = {
                {"Doctor", "Doctor"},
                {"Cooper", "Hofstadter", "Wolowitz"}
        };
    

Generické datové typy

Při deklaraci generického datového typu předáváme objektu i informaci i typu objektu se kterým bude pracovat. Na příkladu kolekcí tento předaný typ říká jaké objekty budou v kolekci uloženy.
    
    // Negenerická kolekce
    List list = new ArrayList();
    list.add("Cooper");


    String s = (String) list.get(0); // Je nutné přetypování

    // Generická kolekceList

    List list = new ArrayList(); //Pokud je typ 
        list.add("Cooper");

        String s = list.get(0); // Není třeba přetypovávat
    

Kolekce List

List je abstraktní třída která reprezentuje kolekci pro "seznam" a obsahuje celou řadu metod pro práci s ním. List nejde vytvořit pomocí new. Implementací můžeme vytvořit vlastní kolekci. Máme dvě základní implementace ArrayList a LinkedList.

Metody

ArrayList

Můžeme jej nazvat "samozvětšovacím" polem. Pokud při přidání prvku přeplníme kapacitu automaticky se zvětší a nedojde k chybě. Přidání nového prvku má složitost O(n) a získání prvku O(n)

LinkedList

Spojový seznam který je také dynamický. Složitost přidání a získání prvku je O(n).

Autoboxing a unboxing

Automatická konverze Java kompilátoru mezi primitivními datovými typy a objekty, které je zapouzdřují. Například int na Integer. Opačný směr se nazývá unboxing.

Konstrukce foreach

Kostrukce for pro procházení všech prvků v kolekci.
        
            int[] numbers = {1,2,3,4,5,6,7,8};

            for (int number : numbers) {
                // Work with number here
            }
        
    

Úkoly

  1. Implementujte statickou metodu int[] even(int[] foo) vracející pole čísel, kde budou pouze sudá čísla z argumentu foo.

  2. Implementujte statickou metodu List<Object> even(List<Object> foo) vracející seznam čísel, kde budou pouze sudá čísla foo. Pokud argument foo obsahuje objekt, který není celé číslo, je tento objekt ignorován. Tuto funkcionalitu ověřte.

  3. Implementujte statickou metodu List<Integer> evenNumbers(List<Integer> foo) vracející seznam čísel, kde budou pouze sudá čísla z foo.

  4. S využítím třídy Point z minulého cvičení implementujte statickou metodu Point nearest(Point p, List<Point> points), která vrací ze seznamu points bod, který je nejblíže bodu p.

  5. Implementujte funkce int[] merge(int[], int[]) a List<Integer> merge(List<Integer>, List<Integer>), které mají na vstupu setříděné posloupnosti celých čísel a provedou jejich ,,slití'', které vrátí na výstup jako nové setříděné pole/seznam.

  6. S využitím metody List<Integer> merge(List<Integer>, List<Integer>) implementuje metodu List<Integer> mergeSort(List<Integer>), implementující algoritmus MergeSort.

  7. (Nepovinný). Ověřte si rychlost metody mergeSort, když budete v metodě merge vytvářet seznam jako ArrayList a když budete používat LinkedList. Využijte metody System.currentTimeMillis().

Úkoly posílejte na email r.vyjidacek@gmail.com s předmětem ZP3JV03. Termín odevzdání do půlnoci 18. 10. 2017. Odevzdávejte pouze zdrojové kódy v archivu zip.