// 13_Collections.java - שימוש באוספים: List, Set, Map

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;

public class Collections {
    public static void main(String[] args) {
        // ArrayList - רשימה דינמית
        System.out.println("--- ArrayList ---");
        List<String> names = new ArrayList<>();
        names.add("אורי");
        names.add("דוד");
        names.add("רחל");

        System.out.println("הרשימה: " + names);
        System.out.println("האורך: " + names.size());
        System.out.println("האיבר הראשון: " + names.get(0));

        names.add(1, "שרה");
        System.out.println("אחרי הוספה באמצע: " + names);

        names.remove("דוד");
        System.out.println("אחרי הסרה: " + names);

        // מעבר על ArrayList
        for (String name : names) {
            System.out.println("שלום " + name);
        }

        // LinkedList
        System.out.println("\n--- LinkedList ---");
        List<Integer> numbers = new LinkedList<>();
        numbers.add(10);
        numbers.add(20);
        numbers.add(30);
        System.out.println(numbers);

        // HashSet - ללא כפילויות
        System.out.println("\n--- HashSet ---");
        Set<String> unique = new HashSet<>();
        unique.add("תפוח");
        unique.add("בננה");
        unique.add("תפוח");   // לא יתווסף
        unique.add("ענב");

        System.out.println("הקבוצה: " + unique);
        System.out.println("גודל: " + unique.size());
        System.out.println("יש תפוח? " + unique.contains("תפוח"));

        // TreeSet - ממוין
        System.out.println("\n--- TreeSet ---");
        Set<Integer> sorted = new TreeSet<>();
        sorted.add(5);
        sorted.add(1);
        sorted.add(8);
        sorted.add(3);
        System.out.println(sorted);

        // HashMap - צמדי מפתח-ערך
        System.out.println("\n--- HashMap ---");
        Map<String, Integer> ages = new HashMap<>();
        ages.put("אורי", 25);
        ages.put("דוד", 30);
        ages.put("רחל", 28);

        System.out.println("הגיל של דוד: " + ages.get("דוד"));
        System.out.println("יש אורי? " + ages.containsKey("אורי"));

        // מעבר על Map
        System.out.println("\nכל הערכים:");
        for (Map.Entry<String, Integer> entry : ages.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }

        // TreeMap - ממוין לפי מפתחות
        System.out.println("\n--- TreeMap ---");
        Map<String, Integer> sortedMap = new TreeMap<>();
        sortedMap.put("גולן", 1);
        sortedMap.put("אבי", 2);
        sortedMap.put("בני", 3);
        System.out.println(sortedMap);

        // דוגמה: ספירת מילים
        System.out.println("\n--- ספירת מילים ---");
        String text = "apple banana apple cherry banana apple";
        String[] words = text.split(" ");

        Map<String, Integer> counts = new HashMap<>();
        for (String word : words) {
            counts.put(word, counts.getOrDefault(word, 0) + 1);
        }

        for (Map.Entry<String, Integer> entry : counts.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}
