Комплектът е просто колекция от уникални предмети. Уникален означава, че два обекта не могат да имат еднаква стойност(и). В зависимост от изпълнението на комплекта може да бъде поръчан 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 HashSet
or 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