Загрузка...

HashSet в Java

Создайте HashSet<String> с именем tags, вызовите tags.add("oak");, затем tags.add("pine");, затем снова tags.add("oak");, и выведите tags.size(). Скомпилируйте Bin.java и запустите java Bin. На экране должна быть одна строка: 2. Второй oak не создал третьего значения. Уникальные значения в одном set — вот чему учит эта страница.

Уникальные значения, не пары ключ-и-значение

На странице HashMap вы сохраняли ключ, указывающий на значение, через put и get. HashSet хранит значения сами по себе. Каждое значение появляется не больше одного раза. Если вы дважды делаете add одного и того же слова, set по-прежнему держит его один раз. На учебном пути этой страницы отдельной строки-ключа нет.
Откройте Bin.java. Оставьте имя публичного класса Bin, чтобы оно совпадало с именем файла. Удалите оставшиеся строки HashMap, scores.put, scores.get и любой демо Desk. Они относятся к странице map. Также удалите любой остаток ArrayList, Rack, Scanner или nextLine. Программа не должна ждать ввода.
Близко к верху, над public class Bin, напишите:
import java.util.HashSet;
Этот import делает тип HashSet доступным по короткому имени. Без него javac на этой странице не видит короткое имя HashSet. Аккуратно пишите java.util и HashSet. Не делайте import java.util.*; обязательным здесь — одного точного import достаточно.
Внутри main создайте set:
HashSet<String> tags = new HashSet<String>();
В угловых скобках стоит String, потому что этот урок хранит слова. Имя tags — то, которое вы сохраняете. Вызов new HashSet<String>() строит пустой set. В этот момент в нём ноль значений.

Добавьте oak, pine, снова oak — затем size

Вызовите tags.add("oak"); на своей строке. Затем вызовите tags.add("pine");. Затем вызовите tags.add("oak"); в третий раз с тем же словом. Третий вызов не увеличивает set. Затем напишите:
System.out.println(tags.size());
Для первого сохранённого файла печатайте размер, а не весь set. Число 2 доказывает, что дубликат проигнорирован. Сохраните перед компиляцией.

Bin size after duplicate add

java
import java.util.HashSet;

public class Bin {
    public static void main(String[] args) {
        HashSet<String> tags = new HashSet<String>();
        tags.add("oak");
        tags.add("pine");
        tags.add("oak");
        System.out.println(tags.size());
    }
}

Из папки, где лежит Bin.java, выполните javac Bin.java. Когда скобки, фигурные скобки, угловые скобки и точки с запятой совпадают, javac не пишет собственной строки. Затем выполните java Bin — не java Bin.java и не java HashSet. Уберите окончание .java из команды запуска.
Программа должна напечатать одну строку и остановиться: 2. Она не должна просить вас печатать. Если терминал ждёт ввода с клавиатуры, в каком-то файле ещё остался вызов nextLine из старого упражнения. Удалите этот вызов и оставьте создание, три строки add и System.out.println(tags.size());.
Пройдите запуск один раз. Java стартует с Bin.main. Import уже назвал, какой HashSet вы имеете в виду. Строка new строит пустой set. Первый add сохраняет oak. Второй сохраняет pine. Третий add("oak") находит oak уже и не поднимает счёт. Печать size() пишет 2. Экран показывает 2. Больше ничего печататься не должно. Если видите 3, вы не запускаете этот файл HashSet или добавили другое третье слово вроде elm. Если видите leaf, ещё работает демо HashMap из Desk — перейдите на java Bin. Если видите [oak, pine], вы напечатали весь set вместо size(); для первого учебного файла оставьте печать размера.
Если javac говорит, что не находит HashSet, строка import отсутствует, написана с ошибкой или стоит после public class Bin. Переместите import java.util.HashSet; выше строки класса. Если напишете tags.add(oak); без кавычек, javac считает oak отсутствующим именем. Оставьте кавычки. Не вызывайте put у HashSet на этой странице — это имя принадлежит HashMap.

Спросить через contains

Второй файл Bin проверяет, есть ли oak в set после тех же первых двух add.

Bin contains oak

java
import java.util.HashSet;

public class Bin {
    public static void main(String[] args) {
        HashSet<String> tags = new HashSet<String>();
        tags.add("oak");
        tags.add("pine");
        System.out.println(tags.contains("oak"));
    }
}

Скомпилируйте и запустите этот второй файл так же. Экран показывает true. Вызов contains("oak") спрашивает, сидит ли это значение в set. Он возвращает boolean. Если спросить contains("elm") после добавления только oak и pine, экран покажет false — это верно, но сохранённый второй файл использует "oak", чтобы экран был true.
Не делайте цикл по set обязательным на этой странице. Следующая страница — iterating — обходит коллекции. Оставайтесь здесь с add, size и contains.

Рядом с HashMap

Короткая таблица держит разницу ясной.

📊 HashSet vs HashMap

Piece On this page
store tags.add("oak"); — value only
duplicate second add("oak") does not grow size
read check tags.contains("oak") → true
HashMap leftover put / get — not this page’s path
Таблица — только напоминание. Набранные куски, которые вы сохраняете: import HashSet, строка создания, вызовы add, size() и contains.

Сравнение с HashMap и с ArrayList

На странице HashMap put и get использовали ключ. На этой странице add и contains используют само значение. Оставшийся файл Desk, печатающий leaf, — другой урок. Для этой страницы оставьте HashSet<String> tags и демо размера, печатающее 2.
ArrayList может держать одно и то же слово дважды. HashSet не растёт от второго одинакового add этого слова. Эта уникальность — суть урока. Не смешивайте tags.get(0) в демо Bin — на этой странице set не использует номера слотов списка.
Когда рядом ещё лежат старые Desk.java или Rack.java, оставьте их или удалите только если они путают, какой класс вы запускаете. Запустите java Bin после компиляции файла HashSet этого урока.

Что остаётся для iterating

Эта страница открывает set уникальных значений. Следующая страница обходит коллекции циклом. Оставайтесь здесь с add, size и contains. Не делайте for-each по set обязательным на этой странице; цель урока — уникальность и экран 2 от size().

Перед iterating

Вы можете импортировать java.util.HashSet, создать HashSet<String> tags, добавить oak, pine и снова oak, затем напечатать tags.size(), чтобы увидеть 2. Второй файл может напечатать tags.contains("oak") и показать true. Скомпилируйте Bin.java и запустите java Bin для каждого сохранённого демо. Set сохранил уникальные значения. Следующая страница — iterating, где вы обходите значения коллекции по одному.
Держите import над классом. Держите повторный add("oak") в демо размера, чтобы счёт оставался 2. Держите contains для boolean-проверки. Эти привычки — контрольная точка этой страницы перед переходом дальше. Когда после трёх add с повторным oak size() показывает 2, HashSet сделал работу этого урока, и вы готовы к следующей теме.

🧠 Проверьте Свои Знания

Готов к Началу

Проверьте Свои Знания

Бросьте себе вызов с помощью этой интерактивной викторины и узнайте, насколько хорошо вы понимаете тему

❓
6
Вопросы
🎯
70%
Для Прохождения
♾️
∞
Время
🔄
∞
Попытки

📝 Инструкции

  • Внимательно прочитайте каждый вопрос
  • Выберите лучший ответ на каждый вопрос
  • Вы можете пересдавать тест столько раз, сколько захотите
  • Ваш прогресс будет показан вверху