Sobes.tech
Junior

Aké sú spôsoby iterácie cez kolekcie v Jave?

sobes.tech AI

Odpoveď od AI

V jave existuje niekoľko spôsobov iterácie cez kolekcie:

  • Cyklus for s použitím indexu (pre kolekcie podporujúce prístup cez index, napríklad ArrayList, LinkedList):
    Vhodné pre kolekcie, kde je prístup k prvkom cez index efektívny.

    // Príklad iterácie cez ArrayList
    ArrayList<String> list = new ArrayList<>();
    list.add("A");
    list.add("B");
    list.add("C");
    
    for (int i = 0; i < list.size(); i++) {
        String element = list.get(i);
        System.out.println(element);
    }
    
  • Rozšírený for cyklus (Enhanced for loop / for-each loop):
    Najčastejšie a najpohodlnejšie. Vhodné pre akékoľvek kolekcie implementujúce rozhranie Iterable.

    // Príklad iterácie cez ArrayList s použitím for-each
    ArrayList<String> list = new ArrayList<>();
    list.add("A");
    list.add("B");
    list.add("C");
    
    for (String element : list) {
        System.out.println(element);
    }
    
  • Použitie Iterator:
    Flexibilnejší spôsob, umožňujúci odstraňovanie prvkov počas iterácie. Vhodné pre všetky kolekcie.

    // Príklad iterácie s použitím `Iterator`
    ArrayList<String> list = new ArrayList<>();
    list.add("A");
    list.add("B");
    list.add("C");
    
    Iterator<String> iterator = list.iterator();
    while (iterator.hasNext()) {
        String element = iterator.next();
        System.out.println(element);
        // Môžete bezpečne odstraňovať prvky
        // if (element.equals("B")) {
        //     iterator.remove();
        // }
    }
    
  • Použitie ListIterator (pre zoznamy):
    Špecializovaný iterator pre kolekcie implementujúce rozhranie List. Umožňuje pohyb dopredu aj dozadu, ako aj pridávanie a menenie prvkov.

    // Príklad iterácie s použitím `ListIterator`
    ArrayList<String> list = new ArrayList<>();
    list.add("A");
    list.add("B");
    list.add("C");
    
    ListIterator<String> listIterator = list.listIterator();
    while (listIterator.hasNext()) {
        String element = listIterator.next();
        System.out.println(element);
    }
    // Príklad iterácie späť
    while (listIterator.hasPrevious()) {
        String element = listIterator.previous();
        System.out.println(element);
    }
    
  • Streams API (od Java 8):
    Funkcionálny prístup s použitím lambda výrazov. Umožňuje vykonávať operácie nad prvkami kolekcie (filtering, transformácia atď.) deklaratívnym spôsobom. Iterácia prebieha "vnútorne" v rámci toku.

    // Príklad iterácie s použitím Streams API
    ArrayList<String> list = new ArrayList<>();
    list.add("A");
    list.add("B");
    list.add("C");
    
    list.stream()
        .forEach(element -> System.out.println(element));
    
    // Príklad s filtrovaním a transformáciou
    // list.stream()
    //     .filter(element -> element.startsWith("A"))
    //     .map(String::toLowerCase)
    //     .forEach(System.out::println);
    

Výber vhodného spôsobu závisí od konkrétneho úlohy, typu kolekcie a požadovaného výkonu. Pre väčšinu prípadov je najpohodlnejší rozšírený for cyklus. Ak je potrebné odstraňovať prvky počas iterácie, odporúča sa použiť Iterator. Pre zoznamy, kde je potrebná obojsmerná iterácia, je vhodný ListIterator. Streams API poskytuje mocné možnosti pre spracovanie dát deklaratívnym spôsobom.