Очистка и клонирование
Часть раздела Логика и управление потоком путешествия по Java на Coddy. Урок 27 из 59.
Метод clear() удаляет все элементы из HashSet, оставляя его пустым.
Метод clone() возвращает поверхностную копию HashSet. (Сами элементы не клонируются.)
Например, сначала создайте HashSet:
HashSet<String> set = new HashSet<>();
set.add("Coddy");Чтобы клонировать множество:
HashSet<String> clonedSet = (HashSet<String>) set.clone();
System.out.println(clonedSet);
// Вывод: [Coddy]Чтобы очистить множество:
set.clear();
System.out.println(set.isEmpty());
// Вывод: trueЗачем нужно приведение типов при использовании clone()?
Вы уже узнали о приведении типов для примитивных типов (например, int x = (int) 3.14). Та же концепция применима к объектам, но по другой причине.
Метод clone() возвращает обобщённый тип Object, а не конкретный тип HashSet<String>. Это потому, что clone() определён в классе Object и не знает, объект какого типа вы клонируете.
// Что возвращает clone():
Object cloneResult = set.clone(); // Возвращает Object, а не HashSet<String>
// Что нам нужно:
HashSet<String> clonedSet = (HashSet<String>) set.clone(); // Привести Object к HashSet<String>Приведение типа сообщает Java: «Я знаю, что этот Object на самом деле является HashSet<String>, поэтому обращайся с ним как с таким объектом».
Без приведения типа возникнет ошибка компиляции, потому что Java не преобразует автоматически Object в HashSet<String>.
Задание
ЛегкоСоздай метод с именем processSet, который принимает на вход HashSet строк. Метод должен:
- Клонировать множество.
- Очистить исходное множество.
- Вывести клонированное множество и его размер в формате:
Cloned Set: [elements]Cloned Set Size: X - Вывести исходное множество (после очистки) и его размер в формате:
Original Set after clear: [elements]Original Set Size: Y
Попробуйте сами
import java.util.HashSet;
import java.util.Scanner;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
@SuppressWarnings("unchecked")
public class Main {
public static void processSet(HashSet<String> set) {
// Напишите свой код здесь
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String setString = scanner.nextLine();
Type setType = new TypeToken<HashSet<String>>(){}.getType();
HashSet<String> set = new Gson().fromJson(setString, setType);
processSet(set);
}
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Многомерные массивы
Основы 2D-массивовДоступ к элементам 2D-массиваВложенные циклы с 2D-массивамиПовторение - 2D-массивыСложение и вычитание матрицРваные массивы3D-массивы и вышеРаспространённые паттерны 2D-массивовПовторение - всё о массивах4HashSet Часть 1
Что такое HashSet?Добавление элементаУдаление элементаПроверка наличия элементаПустота и размерОчистка и клонированиеПовторение - HashSet2HashMap Часть 1
Что такое HashMap?Объявление HashMapДоступ к значениямПроверка существования ключаИзменение словарейИтоги - HashMap3HashMap. Часть 2
Методы HashMapИтерация с keySet()Итерация с entrySet()Вложенный HashMapПовторение - Управление складомПовторение - Операции HashMap6Продвинутое управление потоком
Операторы метокВыражение switchСопоставление шаблоновОхранные клаузыИтоги - управление потоком9Проект - Счетчик уникальных слов
Ввод и хранение текстаОбработка словПотренируйтесь самостоятельно: Онлайн-компилятор Java