Zdrojový kód z prednášky 7.12.2011

ArrayList

Práca s ArrayList-om:

import java.util.*;

public class Spustac {

        /**
         * @param args
         */

        public static void main(String[] args) {
                // Vytvorime ArrayList retazcov
                ArrayList<String> slova = new ArrayList<String>();
                // Do ArrayList-u pridame retazec Dobry (bude na indexe 0)
                slova.add("Dobry");
                // Do ArrayList-u pridame retazec Dobry (bude na indexe 1)
                slova.add("den");

                // Vypiseme obsah ArrayList-u
                System.out.println(slova.toString());

                // Zmenime obsah ArrayList-u na indexe 1 (zmenime den na vecer)
                slova.set(1, "vecer");

                // Vypiseme obsah ArrayList-u
                System.out.println(slova.toString());

                // Vypiseme obsah na indexe 0 v ArrayListe slova
                System.out.println(slova.get(0));

                // Vypis obsahu ArrayListu pomocou for-cyklu
                for (int i = 0; i < slova.size(); i++)
                        System.out.println(slova.get(i));
        }
}

Trieda, ktorej objekty vedia robiť nejakú tú prácu so zoznamom čísel.

import java.util.*;

public class Zoznamar {

        /**
         * Spocita sucet cisel v zozname cisel
         * @param cisla nejaky zoznam cisel
         * @return sucet cisel
         */

        public int sucet(List<Integer> cisla) {        
                int sucet = 0;
                // Prechadzame zoznamom cisel, ale davame
                // si pozor na to, ze na niektorych polickach
                // moze byt aj null
                for (int i=0; i<cisla.size(); i++)
                        if (cisla.get(i) != null)
                                sucet = sucet + cisla.get(i);

                return sucet;
        }

        /**
         * Spocita sucet cisel v zozname cisel
         * @param cisla nejaky zoznam cisel
         * @return sucet cisel
         */

        public int sucet2(List<Integer> cisla) {               
                int sucet = 0;
                // Ukazka vyuzitia for-each cyklu
                for (Integer cislo: cisla)
                        if (cislo != null)
                                sucet = sucet + cislo;

                return sucet;
        }              
}

A k triede Zoznamar ukážkový "spúšťač":

List<Integer> cisla = new ArrayList<Integer>();
Integer cislo1 = new Integer(2011);
Integer cislo2 = new Integer(2012);
cisla.add(new Integer(10));
cisla.add(cislo1);
cisla.add(null);
cisla.add(cislo2);
cisla.add(cislo2);
cisla.add(15);

Zoznamar z = new Zoznamar();
System.out.println(z.sucet(cisla));

Set

Krátky demonštračný kód k vysvetleniu množiny čísel a využitiu metódy equals objektov "obaľovacej" triedy Integer. Výpisy demonštrujú návratovú hodnotu metódy add.

Set<Integer> mCisla = new HashSet<Integer>();
System.out.println(mCisla.add(new Integer(2011)));
System.out.println(mCisla.add(new Integer(2011)));
System.out.println(mCisla.add(2011));
System.out.println(mCisla.add(2012));
System.out.println(mCisla.size());
System.out.println(mCisla.contains(new Integer(2011)));

Body (Set a equals/hashCode)

Trieda Bod, ktorej objekty reprezentujú nemeniteľný bod s x-ovou a y-ovou súradnicou. Zakomentovaný je kód metód equals a hashCode napísaný počas prednášky. Nezakomentovaný je kód vygenerovaný automaticky prostredím Eclipse.


public class Bod {
        private double x;
        private double y;

        public Bod(double x, double y) {
                super();
                this.x = x;
                this.y = y;
        }

        public double getX() {
                return x;
        }

        public double getY() {
                return y;
        }

        @Override
        public int hashCode() {
                final int prime = 31;
                int result = 1;
                long temp;
                temp = Double.doubleToLongBits(x);
                result = prime * result + (int) (temp ^ (temp >>> 32));
                temp = Double.doubleToLongBits(y);
                result = prime * result + (int) (temp ^ (temp >>> 32));
                return result;
        }

        @Override
        public boolean equals(Object obj) {
                if (this == obj)
                        return true;
                if (obj == null)
                        return false;
                if (getClass() != obj.getClass())
                        return false;
                Bod other = (Bod) obj;
                if (Double.doubleToLongBits(x) != Double.doubleToLongBits(other.x))
                        return false;
                if (Double.doubleToLongBits(y) != Double.doubleToLongBits(other.y))
                        return false;
                return true;
        }



//      @Override
//      public boolean equals(Object obj) {
//              if (obj == null)
//                      return false;
//             
//              if (obj == this)
//                      return true;
//             
//              if (!(obj instanceof Bod))
//                      return false;
//             
//              Bod objBod = (Bod)obj;
//              return (objBod.getX() == this.getX()) &&
//                     (objBod.getY() == this.getY());
//      }
//     
//      @Override
//      public int hashCode() {
//              return 0;
//      }
}

Kombinácia Set-ov a objektov triedy Bod:

Bod b1 = new Bod(100, 200);
Bod b2 = new Bod(150, 200);
Bod b3 = new Bod(100, 200);
// Test zhodnosti objektov
System.out.println(b1.equals(b2));
System.out.println(b1.equals(b3));
// Hashcode-y objektov
System.out.println(b1.hashCode());
System.out.println(b2.hashCode());
System.out.println(b3.hashCode());

Set<Bod> body = new HashSet<Bod>();
body.add(b1);
body.add(b2);

// Vypis pomocou iteratora
Iterator<Bod> it = body.iterator();
while (it.hasNext()) {
        Bod b = it.next();
        System.out.println(bod.getX() + ", " + bod.getY());
}

// Vypis pomocou for-each cyklu
for (Bod bod : body) {
        System.out.println(bod.getX() + ", " + bod.getY());
}

Map

Príklad využitia Map-ov na analýzu počtu výskytov slov v textovom súbore (ide o rozšírený zdrojový kód v porovnaní s tým, čo bolo na prednáške).

import java.io.*;
import java.util.*;

public class Spustac {

        /**
         * @param args
         */

        public static void main(String[] args) {
                // Vytvorime tabulku, v ktorej pre kazde slovo
                // budeme pamatat pocet vyskytov
                Map<String, Integer> vyskyty = new HashMap<String, Integer>();

                // Klasicke citanie zo suboru po slovach ...
                Scanner citac = null;
                try {
                        citac = new Scanner(new File("text.txt"));
                        while (citac.hasNext()) {
                                String slovo = citac.next();

                                // Rozhodneme sa podla toho, ci sa uz slovo vyskytlo,
                                // t.j. podla toho ci taketo slovo mame v Map-e
                                // "na lavej strane" medzi klucmi
                                if (vyskyty.containsKey(slovo))
                                        // ak ano, tak zvysime hodnotu
                                        // pri tomto kluci (slove) o 1
                                        vyskyty.put(slovo, vyskyty.get(slovo) + 1);
                                else
                                        // ak nie, tak slovo vidime prvy krat
                                        // a nastavime pocet jeho vyskytov na 1
                                        vyskyty.put(slovo, 1);
                        }
                } catch (FileNotFoundException e) {
                        System.err.println("Strasna chyba");
                } finally {
                        if (citac != null)
                                citac.close();
                }

                // Pekny vypis Map-u
                System.out.println(vyskyty.toString());

                // Nechame si spocitam maximum z hodnot v Map-e, t.j.
                // maximum z poctov vyskytov
                int maxPocetVyskytov = Collections.max(vyskyty.values());

                // Vypiseme vsetky slova, ktore maju taky pocet vyskytov
                // ako je vypocitane maximum
                for (String slovoKluc : vyskyty.keySet())
                        if (maxPocetVyskytov == vyskyty.get(slovoKluc))
                                System.out.println(slovoKluc);

                // "Finta" ako vybrat nejaky prvok z neprazdnej mnoziny
                if (vyskyty.keySet().size() > 0) {
                        String nejakyKluc = vyskyty.keySet().iterator().next();
                        System.out.println(nejakyKluc);
                }

                // Klasicke najdenie najcastejsieho slova
                String najcastejsieSlovo = null;
                int najPocetVyskytov = 0;

                for (String kluc : vyskyty.keySet())
                        if (najPocetVyskytov < vyskyty.get(kluc)) {
                                najcastejsieSlovo = kluc;
                                najPocetVyskytov = vyskyty.get(kluc);
                        }

                System.out.println(najcastejsieSlovo + " bolo " + najPocetVyskytov);
        }

}