CodeGym /Java блог /Случаен /Наборът Java като интерфейс
John Squirrels
Ниво
San Francisco

Наборът Java като интерфейс

Публикувано в групата
Комплектът е просто колекция от уникални предмети. Уникален означава, че два обекта не могат да имат еднаква стойност(и). В зависимост от изпълнението на комплекта може да бъде поръчан or не. Наборът на Java, като абстрактен тип данни (ADT), има няколко ключови операции (където T представлява произволен тип данни, напр. int, String or всеки обект от клас): Наборът Java като интерфейс - 1
  • boolean add(T item): връща true, ако елементът е добавен успешно към набора, и false, ако елементът вече е бил в набора.
  • boolean remove(T item): връща true, ако елементът е бил успешно премахнат от набора и false в противен случай (ако елементът не е бил в набора).
  • boolean contains(T item): връща true, ако елементът е в набора и false в противен случай.
  • boolean isEmpty(): връща true, ако наборът е празен, и false в противен случай.
Наборите в Java имат доста ясни сигнатури на функциите (Howто трябва). Ако добавите два еднакви артикула към комплект, тогава само първият добавен артикул ще бъде в комплекта. Всички последващи опити за добавяне на същия елемент ще бъдат игнорирани, освен ако елементът не бъде премахнат първо. Една от най-често използваните операции с набори е проверката дали даден елемент е в рамките на даден набор. Функцията 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 отличник, тогава тази операция просто се игнорира.
С такава система вие винаги ще разполагате с актуален набор от всички „А“ ученици във вашия клас. Ако искате да проверите дали Johnny Appleseed се справя добре във вашия клас, можете лесно да го направите, като се обадите 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(): връща итератор към набора, започвайки от първия обект.
Можете да си представите намирането на applications за тези функции в примера за „списък с отлични студенти“: можете да се обадите, 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
Това е всичко! Надявам се това да е помогнало 😊
Коментари
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION