Загрузка данных


Обработка заняла 9s

Да. Я изучил именно эту лекцию и ниже сделаю все задания практической работы №5, максимально простым способом и только на тех коллекциях и приёмах, которые есть в лекции. В лекции всего 5 заданий, пятое — дополнительное *. 


---

Сначала сама лекция — что тебе надо понять

1. Зачем нужны коллекции

Массив:

int[] a = new int[5];

имеет фиксированный размер.

Если там уже 5 элементов, шестой просто так добавить нельзя.

Коллекции — это готовые структуры, которые могут:

увеличиваться;

удалять элементы;

искать элементы;

перебирать элементы.


Проще:

> Массив — размер заранее фиксирован. Коллекция — размер может меняться. 




---

2. Три главных вида коллекций

List

Список.

элементы идут по порядку;

есть индексы;

повторы разрешены.


Например:

[5, 10, 5, 20]

Для него обычно используют ArrayList.


---

Set

Множество.

повторов нет;

индексов нет.


Если написать:

a.add(5);
a.add(5);

второй 5 не добавится.

Главный вариант — HashSet.


---

Map

Хранит:

ключ → значение

Например:

Анна → 123456
Борис → 789012

Главный вариант — HashMap.

Ключи должны быть уникальными. Если добавить существующий ключ ещё раз, старое значение заменится. 


---

3. ArrayList

Это массив, который может увеличиваться.

ArrayList<Integer> a = new ArrayList<>();

Основные команды:

add()       добавить
get()       получить
remove()    удалить
size()      количество
contains()  проверить наличие
clear()     удалить всё
set()       заменить
isEmpty()   проверить, пустой ли




---

Практическая работа №5


---

№1. Работа со списком оценок

Что требуется

Создать ArrayList<Integer> с 10 оценками.

Потом:

1. вывести оценки;


2. найти среднее;


3. удалить все оценки меньше 3;


4. добавить 5;


5. вывести итоговый список.



И очень важный момент: при удалении идём с конца списка, потому что после удаления остальные элементы сдвигаются. Это прямо указано в задании. 

Максимально простой код

import java.util.ArrayList;

class Main {
    public static void main(String[] args) {

        ArrayList<Integer> a = new ArrayList<>();

        a.add(4);
        a.add(2);
        a.add(5);
        a.add(3);
        a.add(1);
        a.add(4);
        a.add(5);
        a.add(2);
        a.add(3);
        a.add(4);

        for (int i = 0; i < a.size(); i++) {
            System.out.print(a.get(i) + " ");
        }

        System.out.println();

        int s = 0;

        for (int i = 0; i < a.size(); i++) {
            s = s + a.get(i);
        }

        double d = (double) s / a.size();

        System.out.println("Среднее: " + d);

        for (int i = a.size() - 1; i >= 0; i--) {
            if (a.get(i) < 3) {
                a.remove(i);
            }
        }

        a.add(5);

        System.out.println(a);
    }
}

Как это работает

Создаём пустой список:

ArrayList<Integer> a = new ArrayList<>();

Потом добавляем оценки:

a.add(4);
a.add(2);
a.add(5);

Получается:

[4, 2, 5]


---

Выводим

for (int i = 0; i < a.size(); i++) {
    System.out.print(a.get(i) + " ");
}

a.size() — количество элементов.

a.get(i) — получить элемент по индексу.


---

Считаем сумму

int s = 0;

Сначала сумма равна 0.

Потом:

s = s + a.get(i);

Каждый элемент добавляется к s.


---

Среднее

double d = (double) s / a.size();

Например сумма = 33, элементов = 10.

33 / 10 = 3.3


---

Удаляем оценки меньше 3

for (int i = a.size() - 1; i >= 0; i--)

Здесь главное — идём справа налево.

Например:

[4, 2, 5, 3, 1]

Удалили 1:

[4, 2, 5, 3]

Индексы изменились.

Если идти с начала, можно случайно пропустить элемент.

Поэтому:

последний → предпоследний → ... → первый

Если:

a.get(i) < 3

то:

a.remove(i);

удаляем эту оценку.


---

Добавляем пятёрку

a.add(5);

Добавляет 5 в конец.


---

№2. Уникальные слова — HashSet

Что требуется

Есть текст.

Нужно:

1. разбить его на слова;


2. сделать всё маленькими буквами;


3. положить слова в HashSet;


4. повторяющиеся слова автоматически исчезнут;


5. вывести количество;


6. проверить, есть ли слово java.



Это прямо соответствует заданию из лекции. 

Чтобы не усложнять с точками и запятыми, возьмём текст без знаков препинания:

import java.util.HashSet;

class Main {
    public static void main(String[] args) {

        String a = "Java is great Java is fun I hate Java";

        a = a.toLowerCase();

        String[] b = a.split("\\s+");

        HashSet<String> c = new HashSet<>();

        for (int i = 0; i < b.length; i++) {
            c.add(b[i]);
        }

        System.out.println(c);
        System.out.println("Количество: " + c.size());

        if (c.contains("java")) {
            System.out.println("Содержит java: Да");
        } else {
            System.out.println("Содержит java: Нет");
        }
    }
}

Как работает

Текст:

Java is great Java is fun I hate Java


---

Переводим в нижний регистр

a = a.toLowerCase();

Получаем:

java is great java is fun i hate java


---

Разбиваем на слова

String[] b = a.split("\\s+");

Получаем примерно:

[java, is, great, java, is, fun, i, hate, java]

split("\\s+") разделяет строку на отдельные слова по пробелам/пробельным символам. Именно такой вариант приведён в задании лекции. 


---

Создаём множество

HashSet<String> c = new HashSet<>();


---

Кладём слова

for (int i = 0; i < b.length; i++) {
    c.add(b[i]);
}

Если слово уже есть:

c.add("java");

второй раз его HashSet не добавит.

Получится что-то вроде:

[java, is, great, fun, i, hate]

Порядок может быть другим — для HashSet порядок не гарантируется. 


---

Количество

c.size()

Получаем:

6


---

Проверяем слово

c.contains("java")

Если java есть → true.


---

№3. Частота слов — HashMap

Здесь уже нужно считать:

слово → сколько раз встретилось

Например:

apple → 3
banana → 2
orange → 1

Это именно то, что требуется в третьем задании. 

Код

import java.util.HashMap;

class Main {
    public static void main(String[] args) {

        String a = "apple banana apple orange banana apple";

        a = a.toLowerCase();

        String[] b = a.split("\\s+");

        HashMap<String, Integer> c = new HashMap<>();

        for (int i = 0; i < b.length; i++) {

            if (c.containsKey(b[i])) {
                c.put(b[i], c.get(b[i]) + 1);
            } else {
                c.put(b[i], 1);
            }
        }

        for (String d : c.keySet()) {
            System.out.println(d + " = " + c.get(d));
        }

        String d = "";
        int e = 0;

        for (String f : c.keySet()) {

            if (c.get(f) > e) {
                e = c.get(f);
                d = f;
            }
        }

        System.out.println("Самое частое слово: " + d);
        System.out.println("Количество: " + e);
    }
}

Самая главная часть

if (c.containsKey(b[i])) {

Проверяем:

есть ли такое слово уже в HashMap?

Если есть:

c.put(b[i], c.get(b[i]) + 1);

Например уже было:

apple → 2

c.get("apple") даст 2.

Добавляем 1:

2 + 1 = 3

Получаем:

apple → 3


---

Если слова ещё нет:

c.put(b[i], 1);

Например встретили orange первый раз:

orange → 1


---

Как ищем самое частое

Сначала:

String d = "";
int e = 0;

d — слово.

e — максимальное количество.

Потом перебираем все ключи:

for (String f : c.keySet())

Если нашли число больше текущего максимума:

if (c.get(f) > e)

запоминаем:

e = c.get(f);
d = f;

В итоге:

Самое частое слово: apple
Количество: 3


---

№4. Объединение двух списков без повторов

Есть:

A = [1, 2, 3, 4]
B = [3, 4, 5, 6]

Нужно получить:

[1, 2, 3, 4, 5, 6]

В задании прямо предлагается использовать HashSet, а потом получить ArrayList. 

Максимально простой вариант

import java.util.ArrayList;
import java.util.HashSet;

class Main {
    public static void main(String[] args) {

        ArrayList<Integer> a = new ArrayList<>();
        a.add(1);
        a.add(2);
        a.add(3);
        a.add(4);

        ArrayList<Integer> b = new ArrayList<>();
        b.add(3);
        b.add(4);
        b.add(5);
        b.add(6);

        HashSet<Integer> c = new HashSet<>();

        for (int i = 0; i < a.size(); i++) {
            c.add(a.get(i));
        }

        for (int i = 0; i < b.size(); i++) {
            c.add(b.get(i));
        }

        ArrayList<Integer> d = new ArrayList<>();

        for (Integer x : c) {
            d.add(x);
        }

        System.out.println(d);
    }
}

Как работает

Есть два списка:

a = [1, 2, 3, 4]

b = [3, 4, 5, 6]

Создаём:

HashSet<Integer> c = new HashSet<>();

Кладём туда первый список:

1
2
3
4

Потом второй:

3
4
5
6

Но HashSet не допускает дубликаты.

Поэтому получится:

1 2 3 4 5 6

Потом создаём новый ArrayList:

ArrayList<Integer> d = new ArrayList<>();

И переносим туда элементы HashSet.

В итоге:

d = [1, 2, 3, 4, 5, 6]

Порядок здесь может быть другим, потому что в условии прямо сказано, что порядок не важен. 


---

№5* — телефонный справочник

Это дополнительное задание.

Здесь используется:

HashMap<String, ArrayList<String>>

То есть:

имя → список телефонов

Например:

Анна → [123-45-67, 765-43-21]
Борис → [111-22-33]

Именно такую структуру требует лекция. 

Здесь уже по условию можно сделать методы, потому что сама лекция предлагает операции addContact(), removeNumber(), findContact().

Код максимально просто

import java.util.ArrayList;
import java.util.HashMap;

class Main {

    static HashMap<String, ArrayList<String>> a = new HashMap<>();

    static void addContact(String b, String c) {

        if (a.containsKey(b)) {
            a.get(b).add(c);
        } else {
            ArrayList<String> d = new ArrayList<>();
            d.add(c);
            a.put(b, d);
        }
    }

    static void removeNumber(String b, String c) {

        if (a.containsKey(b)) {

            a.get(b).remove(c);

            if (a.get(b).isEmpty()) {
                a.remove(b);
            }
        }
    }

    static void findContact(String b) {

        if (a.containsKey(b)) {
            System.out.println(a.get(b));
        } else {
            System.out.println("Контакта нет");
        }
    }

    static void printAll() {

        for (String b : a.keySet()) {
            System.out.println(b + " -> " + a.get(b));
        }
    }

    public static void main(String[] args) {

        addContact("Анна", "123-45-67");
        addContact("Анна", "765-43-21");
        addContact("Борис", "111-22-33");

        printAll();

        removeNumber("Анна", "123-45-67");

        findContact("Анна");

        printAll();
    }
}


---

Как понять эту программу

Самая важная строка:

HashMap<String, ArrayList<String>> a = new HashMap<>();

Она означает:

> У нас есть HashMap, где ключ — String, то есть имя человека, а значение — ArrayList строк, то есть список его телефонов.



Поэтому:

Анна → [123-45-67, 765-43-21]


---

Добавление контакта

addContact("Анна", "123-45-67");

Проверяем:

a.containsKey("Анна")

Если Анны ещё нет → создаём список:

[]

добавляем номер:

[123-45-67]

и кладём в Map:

Анна → [123-45-67]


---

Если Анна уже есть:

a.get("Анна").add("765-43-21");

Получается:

Анна → [123-45-67, 765-43-21]


---

Удаление номера

a.get(b).remove(c);

Например:

Анна → [123-45-67, 765-43-21]

удаляем:

123-45-67

остаётся:

Анна → [765-43-21]

Если список стал пустым:

if (a.get(b).isEmpty()) {
    a.remove(b);
}

то удаляем уже самого человека из справочника.


---

Поиск

findContact("Анна");

Если Анна есть:

a.get("Анна")

вернёт её список:

[765-43-21]

Если нет:

Контакта нет


---

Вывод всего справочника

for (String b : a.keySet()) {
    System.out.println(b + " -> " + a.get(b));
}

keySet() даёт нам все имена, то есть все ключи.

Например:

Анна -> [765-43-21]
Борис -> [111-22-33]


---

Что тебе реально выучить перед преподом

Если он спросит про эту лекцию, вот самый полезный набор:

ArrayList

> ArrayList — это список, похожий на массив, но его размер может изменяться. В нём есть индексы и могут быть повторяющиеся элементы.



HashSet

> HashSet — это множество, которое не хранит дубликаты. Индексов у него нет.



HashMap

> HashMap хранит пары ключ-значение. Ключи уникальны. По ключу можно получить значение.



Главное отличие:

ArrayList → элементы по порядку + индексы + повторы

HashSet → только уникальные элементы

HashMap → ключ → значение

Главные команды

ArrayList:
add()
get()
remove()
size()
contains()
set()
clear()
isEmpty()

HashSet:
add()
remove()
contains()
size()
clear()
isEmpty()

HashMap:
put()
get()
remove()
containsKey()
containsValue()
size()
clear()
isEmpty()
keySet()

И ещё обязательно запомни:

> Коллекции не хранят примитивы напрямую, поэтому используется Integer, а не int: ArrayList<Integer>. Но Java автоматически упаковывает int в Integer, поэтому можно спокойно писать list.add(5). 



Это уже покрывает основную часть лекции + все 5 заданий практической №5. Иерархию из десятков редких коллекций учить не надо — сама лекция прямо говорит, что она показана в основном для общего понимания и реально понадобится несколько основных коллекций.