/*
 Dla nas kontener to po prostu obiekt, który może przechowywać jakieś dane w określony 
 sposób. Aby odnieść się do czegoś znanego, można z dużym uproszczeniem przyjąć, 
 że najprostszym kontenerem jest tablica, jednak oczywiście prawdziwe kontenery 
 to klasy znacznie bardziej skomplikowane.
 */
package java6spotkanie;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;

/**
 *
 * @author HZembr01
 */
class Kontenery {

    public static void main(String[] args) {
        // arraylist
        System.out.println("Przyklad dla ArrayList");
        // Tworzenie pustej listy
        ArrayList<String> list = new ArrayList<String>();

        // dodawanie elementów do listy
        list.add("Agnieszka");
        list.add("Patrycja");
        list.add(2, "KasiaF"); // doda sie jako trzeci element listy
        list.add("KasiaA");

        // Wyswietla zawartosc listy
        System.out.println("Zawartosc listy to: "
                + list);

        // Sprawdzanie indeksu elementu
        int pos = list.indexOf("Patrycja");
        System.out.println("Indeksem pozycji patrycja jest: " + pos);

        // Sprawdzanie czy lista jest pusta
        boolean check = list.isEmpty();
        System.out.println("Sprawdzanie czy lista jest pusta: " + check);

        // Pobieranie rozmiaru listy
        int size = list.size();
        System.out.println("Rozmiar listy to: " + size);

        // Sprawdzanie czy element należy do listy
        boolean element = list.contains("Hubert");
        System.out
                .println("Czy lista zawiera Hubert: "
                        + element);

        // Pobieranie konkretnej wartosci - w tym przypadku 0
        String item = list.get(0);
        System.out.println("Zawartosc listy w indexie 0 to: " + item);

        // Uzyskiwanie elementów z listy
        // 1 Pobieranie elementow poprzez petle uzywajac rozmiaru listy
        System.out.println("Pobieranie elementow poprzez petle uzywajac rozmiaru listy");
        for (int i = 0; i < list.size(); i++) {
            System.out.println("Index: " + i + " - Item: " + list.get(i));
        }

        // 2 Pobieranie elementow uzywajac foreach
        System.out.println("Pobieranie elementow uzywajac foreach");
        for (String str : list) {
            System.out.println("Item is: " + str);
        }

        // 3 uzywajac iteratora
        // hasNext(): zwraca true jesli jest wiecej elementow
        // next(): zwraca nastepny element
        System.out.println("Pobieranie elementow poprzez petle uzywajac iteratora");
        for (Iterator<String> it = list.iterator(); it.hasNext();) {
            System.out.println("Item is: " + it.next());
        }

        // zamiana elemenetow
        list.set(1, "Hubert");
        System.out.println("Lista po zamianie: " + list);

        // kasowanie elementow
        // kasowanie pierwszego elementu
        list.remove(0);

        // kasowanie pierwszego elementu pasujacego do wzorca
        list.remove("KasiaF");

        System.out.println("Lista po zmianach wyglada tak: " + list);

        // konwersja listy do tablicy
        String[] simpleArray = list.toArray(new String[list.size()]);
        System.out.println("Tablica utworzona z elementow listy: "
                + Arrays.toString(simpleArray));

        // HashMap
        System.out.println("Przyklad dla HashMap");
        HashMap<String, Long> words = new HashMap<String, Long>();
        //HashMap words = new HashMap();
        long totalTime = 0;

        Scanner input = new Scanner(System.in);

        for (int i = 1; i <= 8; i++) {
            long callTimeStart = System.currentTimeMillis();
            String word = input.next();
            long callTimeStop = System.currentTimeMillis();
            long callTime = callTimeStop - callTimeStart;
            totalTime += callTime;
            words.put(word, callTime);
        }
        System.out.println("Wypisanie kluczy HashMap");
        Iterator iter = words.keySet().iterator();
        for (int i = 1; i <= words.keySet().size(); i++) {
            System.out.println(iter.next());
        }
        System.out.println("Wypisanie wartosci HashMap");
        iter = words.values().iterator();
        for (int i = 1; i <= words.keySet().size(); i++) {
            System.out.println(iter.next());
        }

        System.out.println("Wypisanie par HashMap");
        //iter = words.entrySet().iterator();
        Set set = words.entrySet();
        //iter = set.iterator();
        for (iter = set.iterator(); iter.hasNext();) {
            System.out.println("Item is: " + iter.next());
        }
        /*for (int i = 1; i <= 8; i++) {
         System.out.println(iter.next());
         }*/
        System.out.println(". . .");
        System.out.println(words.size() + " unikalnych słów. " + totalTime + " milisekund. ");
        // TreeSet
        System.out.println("Przyklad dla TreeSet");
        TreeSet<Integer> tree = new TreeSet<Integer>();
        tree.add(12);
        tree.add(63);
        tree.add(34);
        tree.add(45);

        // set jest typem uporzadkowanym, sprawdzmy jakie wartosci ma w kontenerze
        Iterator<Integer> iterator = tree.iterator();
        System.out.print("Wartosci TreeSet: ");

        // wyswietlenie
        while (iterator.hasNext()) {
            System.out.print(iterator.next() + " ");
        }
        System.out.println();

        // sprawdzanie czy jest pusta
        if (tree.isEmpty()) {
            System.out.print("TreeSet jest pusta.");
        } else {
            System.out.println("TreeSet ma rozmiar: " + tree.size());
        }

        // Wyciaganie pierwszego elementu
        System.out.println("Pierwszy element: " + tree.first());

        // Wyciagainie ostatniego elementu
        System.out.println("Ostatni element: " + tree.last());

        if (tree.remove(45)) { // usuwanie po wartosci
            System.out.println("Element skasowany z TreeSet");
        } else {
            System.out.println("Element nie istnieje!");
        }
        System.out.print("Kontener zawiea teraz : ");
        iterator = tree.iterator();

        // Wyswietlanie elementow
        while (iterator.hasNext()) {
            System.out.print(iterator.next() + " ");
        }
        System.out.println();
        System.out.println("Rozmiar TreeSet teraz to: " + tree.size());

        // usuwanie wszystkiego
        tree.clear();
        if (tree.isEmpty()) {
            System.out.print("TreeSet jest pusty.");
        } else {
            System.out.println("Rozmiar TreeSet teraz to: " + tree.size());
        }

    }
}
