Комплектът е просто колекция от уникални предмети. Уникален означава, че два обекта не могат да имат еднаква стойност(и). В зависимост от изпълнението на комплекта може да бъде поръчан or не. Наборът на Java, като абстрактен тип данни (ADT), има няколко ключови операции (където T представлява произволен тип данни, напр. int, String or всеки обект от клас):
boolean add(T item): връща true, ако елементът е добавен успешно към набора, и false, ако елементът вече е бил в набора.boolean remove(T item): връща true, ако елементът е бил успешно премахнат от набора и false в противен случай (ако елементът не е бил в набора).boolean contains(T item): връща true, ако елементът е в набора и false в противен случай.boolean isEmpty(): връща true, ако наборът е празен, и false в противен случай.
contains()дава страхотно време за изпълнение за това: O(1) or O(log n) времева сложност в зависимост от това дали използваната реализация е a HashSetor aTreeSet, съответно. И така, за Howво може да се използва комплект? Е, ако някога ви се наложи да следите много отделни обекти - като идентификатори, имена or други уникални идентификатори - и често да проверявате дали даден елемент съществува в такава колекция, тогава набор вероятно е добър избор. Ето примерен случай на използване на набор: Представете си, че имате списък с Studentобекти, представляващи всички ученици в даден клас. Всеки Studentможе да има уникално име (низ) и оценка (int) за този клас. Ако искате често да препращате към списък с всички A студенти (клас >=90), тогава би било досадно да преминавате през този списък и да проверявате оценката на всеки ученик всеки път. Вместо това можете да използвате HashSetнизове, които следят всички A студенти в класа, като такива:
- Всеки път, когато оценките на учениците се актуализират, можете просто да проверите дали новата оценка на ученика е по-голяма or равна на 90 or не.
- Ако е така, добавете ги към набора от A ученици, използвайки
add()- Ако вече са бor отличник, тази операция просто се игнорира.
- Ако не, тогава ги премахнете от набора от A ученици, използващи
remove()- Ако в този момент не са бor отличник, тогава тази операция просто се игнорира.
- Ако е така, добавете ги към набора от A ученици, използвайки
contains(“Johnny Appleseed”)на снимачната площадка. Разбира се, това е само един пример за случай на използване на набор и този специфичен проблем за проследяване на A ученици може да бъде решен по други начини.
Реализации: HashSet в Java и примери за Java TreeSet
КактоHashSetв Java, така и TreeSetв Java идват в java.utils package. Можете да ги импортирате като такива:
// imports everything from Java's util package, including HashSet and TreeSet
import java.util.*;
or
import java.util.HashSet; // imports only the Java HashSet
import java.util.TreeSet; // imports only the Java TreeSet
Ключовата разлика между Java HashSetи Java TreeSetе, че TreeSetе сортиран, докато HashSetне е. Ето защо TreeSetима O(log n) времева сложност за ключови операции, докато HashSetима O(1) or постоянна времева сложност; трябва TreeSetда поддържа ред през цялото време. В допълнение към операциите за набор от ключове, споменати по-рано, Howто HashSetи TreeSetв Java имат няколко други полезни функции:
void clear(): изчиства набора от всички обекти.int size(): връща броя на обектите в набора.Object clone(): връща плитко копие на набора.Iterator iterator(): връща итератор към набора, започвайки от първия обект.
size()ако искате да видите колко отлични студенти имате or clear()ако искате да изчистите списъка в края на семестъра. Може да използвате clone(), за да създадете и запазите клонинг на списъка с А студенти в определен момент от време, като например по време на междинни отчети (по този начин клонингът не остава актуален заедно с оригинала).
Пример за Java HashSet
Ето кратък пример за използванеHashSetна s в Java:String
import java.util.HashSet;
class HashSetDemo {
public static void main(String[] args)
{
// create a HashSet of Strings
HashSet<String> hs = new HashSet<String>();
// Add elements using the add() method
hs.add("Collin");
hs.add("Bob");
hs.add("Abigail");
// Duplicates will ignored; this statement is useless
hs.add("Collin");
System.out.println(hs);
System.out.println("Bob is in the set (T/F): " + hs.contains("Bob"));
System.out.println("Max is in the set (T/F): " + hs.contains("Max"));
}
}
Изход: --------
[Collin, Bob, Abigail]
Bob is in the set (T/F): true
Max is in the set (T/F): false
Пример за Java TreeSet
Примерът с набор от Java може да ви помогне да разберете теорията. Ето краткия пример за използванеTreeSetна s в Java:String
import java.util.TreeSet;
class TreeSetDemo {
public static void main(String[] args)
{
// create a TreeSet of Strings
TreeSet<String> ts = new TreeSet<String>();
// Add elements using the add() method.
ts.add("Collin");
ts.add("Bob");
ts.add("Abigail");
// Duplicates will ignored; this statement is useless
ts.add("Collin");
// printing the set prints the names in alphabetical order!
System.out.println(ts);
System.out.println("Bob is in the set (T/F): " + ts.contains("Bob"));
System.out.println("Max is in the set (T/F): " + ts.contains("Max"));
System.out.println("Size of the set: " + ts.size());
ts.clear();
System.out.println("Size of the set after clear(): " + ts.size());
}
}
Изход: -------
[Abigail, Bob, Collin]
Bob is in the set (T/F): true
Max is in the set (T/F): false
Size of the set: 3
Size of the set after clear(): 0
Това е всичко! Надявам се това да е помогнало 😊
GO TO FULL VERSION