Setเป็นอินเทอร์เฟซใน Java Collection Framework คุณสามารถใช้ Java Setเพื่อใช้งานคอลเล็กชันแบบไม่เรียงลำดับด้วยองค์ประกอบเฉพาะ ในบทความนี้ เราจะดูที่อินเทอร์เฟซนี้และการใช้งานในภาษา Java วิธีการทำงานกับชุด และยังให้ตัวอย่างบางส่วน

Java Set คืออะไร

Setเป็นอินเทอร์เฟซจาก Java Collection Framework แต่Setไม่ใช่คอลเล็กชันที่เรียงลำดับ ซึ่งแตกต่างจากList นั่นหมายความว่าองค์ประกอบ Java Setจะถูกเก็บไว้โดยไม่มีลำดับเฉพาะ ดังนั้นจึงไม่มีการควบคุมตำแหน่งที่คุณสามารถแทรกองค์ประกอบได้ นอกจากนี้ คุณไม่สามารถเข้าถึงองค์ประกอบด้วยดัชนี ในทางคณิตศาสตร์เซตคือชุดขององค์ประกอบที่ไม่ซ้ำกัน ในความเป็นจริง นี่คือคอลเลกชันที่ไม่มีลำดับ (คอลเลกชันที่ไม่มีลำดับ) ซึ่งไม่สามารถจัดเก็บองค์ประกอบที่เหมือนกันได้ หากคุณตั้งใจเพิ่มองค์ประกอบที่ซ้ำกันในSetการดำเนินการนี้จะถูกละเว้นและSetจะไม่เปลี่ยนแปลง อย่างไรก็ตาม อนุญาตให้เก็บหนึ่งองค์ประกอบที่เป็นโมฆะไว้ในนั้น

ตั้งค่าการใช้งาน

Java Setเป็นส่วนต่อประสาน ดังนั้นคุณจำเป็นต้องใช้การใช้งานอย่างใดอย่างหนึ่งเพื่อสร้างออบเจกต์ เหล่า นี้คือHashSet , TreeSetและLinkedHashSet ในSet s แต่ละอิลิเมนต์จะถูกจัดเก็บไว้ในอินสแตนซ์เดียวเท่านั้น และการใช้งาน Set ที่แตกต่างกันจะใช้ลำดับที่แตกต่างกันสำหรับการจัดเก็บอิลิเมนต์ ในHashSetลำดับขององค์ประกอบถูกกำหนดโดยอัลกอริทึมที่ซับซ้อน หากลำดับการจัดเก็บมีความสำคัญต่อคุณ ให้ใช้ คอนเทนเนอร์ TreeSetซึ่งจัดเก็บออบเจกต์ที่เรียงลำดับจากน้อยไปมากในลำดับการเปรียบเทียบ หรือใช้LinkedHashSetซึ่งเก็บองค์ประกอบในลำดับเพิ่มเติม ชุดต่างๆ มักจะใช้สำหรับการทดสอบการเป็นสมาชิก เพื่อให้คุณตรวจสอบได้อย่างง่ายดายว่าออบเจกต์เป็นของชุดที่กำหนดหรือไม่ ดังนั้นในทางปฏิบัติ มักจะเลือกการใช้งาน HashSetที่ปรับให้เหมาะกับการค้นหาอย่างรวดเร็ว HashSetเป็นคอลเลกชันที่ใช้ค่าแฮชที่ส่งคืนโดย เมธอด hashCode()เพื่อจัดเก็บองค์ประกอบภายใน นั่นคือภายในHashSet<E>วัตถุHashMap<E, Object>จะถูกเก็บไว้ซึ่งเก็บค่าของHashSetเป็นคีย์ การใช้รหัสแฮชทำให้คุณสามารถค้นหา เพิ่ม และลบองค์ประกอบออกจากSetได้ อย่างรวดเร็ว LinkedHashSetเป็นชุดแฮชที่เก็บองค์ประกอบในรายการที่เชื่อมโยง HashSetปกติไม่รักษาลำดับองค์ประกอบ ประการแรก อย่างเป็นทางการไม่มีอยู่จริง และประการที่สอง แม้แต่ลำดับภายในก็สามารถเปลี่ยนแปลงได้อย่างมากเมื่อเพิ่มองค์ประกอบเพียงองค์ประกอบเดียว และคุณสามารถรับ iterator จากLinkedHashSetและใช้มันเพื่อผ่านองค์ประกอบทั้งหมดตามลำดับที่แน่นอนซึ่งถูกเพิ่มเข้าไปในLinkedHashSet ไม่บ่อย แต่บางครั้งก็จำเป็นมาก TreeSet เป็นคอลเลกชั่นที่เก็บองค์ประกอบเป็นทรีที่เรียงลำดับตามค่า ภายในTreeSet<E>คือTreeMap<E, Object>ที่เก็บค่าเหล่านี้ทั้งหมด และทรีแมป นี้ใช้ต้นไม้ไบนารีที่สมดุลสีแดงดำเพื่อจัดเก็บองค์ประกอบ ดังนั้นจึงมีการดำเนินการ add() , remove() , container() ที่รวดเร็วมาก

สร้างวัตถุชุด

หากต้องการสร้างSet Object คุณสามารถใช้รูปแบบต่อไปนี้:

Set<Integer> intSet = new HashSet<>();
Set<String> vSet = new HashSet<>();
Set mySet = new LinkedHashSet();
HashSet<String> myHashset = new HashSet<>();
นี่คือตัวอย่างง่ายๆ ที่เราสร้าง 2 Set s, HashSetและLinkedHashSetและเพิ่มเข้าไปในแต่ละองค์ประกอบ 5 องค์ประกอบ เราสามารถใช้ เมธอด add()สำหรับสิ่งนี้

import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;

public class HashSetTest {
    public static void main(String[] args) {
        Set mySet = new HashSet();
        Set mySet2 = new LinkedHashSet();
//adding some string elements
        mySet.add("Stuart");
        mySet.add("Alex");
        mySet.add("Johnny");
        mySet.add("Igor");
        mySet.add("Bel");
        System.out.println(mySet);
        mySet2.add("Stuart");
        mySet2.add("Alex");
        mySet2.add("Johnny");
        mySet2.add("Igor");
        mySet2.add("Bel");
        System.out.println(mySet2);
    }
}
นี่คือผลลัพธ์ของโปรแกรม:
[อเล็กซ์ อิกอร์ สจวร์ต จอห์นนี่ เบล] [สจ๊วร์ต อเล็กซ์ จอห์นนี่ อิกอร์ เบล]
ดังที่เรากล่าวไว้ข้างต้นHashSetไม่รักษาลำดับขององค์ประกอบ แต่LinkedHashSetทำ เป็นLinkedHashSetที่ให้องค์ประกอบตามลำดับที่เราเขียนลงในชุด

วิธีการตั้งค่า Java

ต่อไปนี้เป็นวิธีการที่สำคัญของ Java Set :
  • บูลีนบวก(E e) . เพิ่มองค์ประกอบที่ระบุให้กับชุดหากยังไม่มีอยู่ (การดำเนินการทางเลือก)

  • บูลีนลบ (วัตถุ o ) ลบองค์ประกอบที่ระบุออกจากชุดนี้หากมีอยู่ (การดำเนินการเพิ่มเติม)

  • บูลีน removeAll (Collection c) ลบองค์ประกอบทั้งหมดที่มีอยู่ในคอลเลกชันที่ระบุออกจากชุดนี้ (การดำเนินการทางเลือก)

  • บูลีนretainAll(Collection c ) เก็บเฉพาะองค์ประกอบในชุดนี้ที่มีอยู่ในคอลเลกชันที่ระบุ (การดำเนินการทางเลือก)

  • เป็นโมฆะชัดเจน ( ) ลบองค์ประกอบทั้งหมดออกจากชุด

  • ตัววนซ้ำ ตัววนซ้ำ ( ) ส่งกลับ iterator เหนือองค์ประกอบในชุดนี้

  • ขนาด int() . ใช้เพื่อรับจำนวนองค์ประกอบในชุด

  • บูลีน isEmpty( ) เพื่อตรวจสอบว่า Set ว่างหรือไม่

  • บูลีนประกอบด้วย (Object o ) คืนค่าจริงหากชุดนี้มีองค์ประกอบที่ระบุ

  • ตัววนซ้ำ ตัววนซ้ำ ( ) ส่งกลับ iterator เหนือองค์ประกอบในชุดนี้ องค์ประกอบจะถูกส่งกลับโดยไม่เรียงลำดับ

  • วัตถุ[] toArray( ) ส่งกลับอาร์เรย์ที่มีองค์ประกอบทั้งหมดในชุดนี้ หากชุดนี้รับประกันว่าองค์ประกอบใดจะถูกส่งกลับโดย iterator วิธีนี้จะต้องส่งคืนองค์ประกอบในลำดับเดียวกัน

เมธอดจะคล้ายกับArrayListยกเว้นว่า เมธอด add(Object o)จะเพิ่มออบเจกต์ให้กับชุดหากยังไม่มี ค่าที่ส่งกลับของเมธอดจะเป็นจริงหากมีการเพิ่มอ็อบเจกต์ และมิฉะนั้นจะเป็นเท็จ นอกจากนี้ยังมีบางเมธอดที่สืบทอดมาจากCollection<> Interface: ParallelStream() , removeIf() , stream()และforEach()เมธอดที่สืบทอดมาจากjava.lang.Iterable Interface

ตัวอย่างการดำเนินการหลัก Java Set

ในตัวอย่างนี้ เราสร้างอาร์เรย์ของสตริงแล้วส่งต่อไปยังmySetโดยใช้การดำเนินการArrays.asList จากนั้นเราจะลบองค์ประกอบอีกสองสามรายการและเพิ่มอีกสองสามรายการ ในกรณีนี้ มีองค์ประกอบอย่างใดอย่างหนึ่งในชุดอยู่แล้ว: จะไม่ถูกเพิ่มเข้าไป เราจะลองดำเนินการตรวจสอบความว่างเปล่าisEmpty ()การกำหนดขนาดของ set size()และการล้างชุดขององค์ประกอบทั้งหมดclear()

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

public class HashSetTest2 {
   public static void main(String[] args) {
       //creating a string Array with some names
       String [] friends =  {"Stuart", "Ivy", "Johnny", "Alex", "Igor", "Tanya"};
       //creating a new set and adding elements from string array into it
       Set<String> mySet = new HashSet<>(Arrays.asList(friends));
       System.out.println(mySet);
       //removing two elements from the set
       mySet.remove("Igor");
       mySet.remove("Stuart");

       System.out.println(mySet);

       //adding 2 new Elements into set
       mySet.add("Dasha");
       mySet.add("Alex"); //it's second Alex, can't be added
       System.out.println(mySet);
       //cheking the size of mySet
       int size = mySet.size();
       System.out.println("The quantity of set's elements = " + size);
       //Checking if the set is empty
       System.out.println("Is mySet empty? " + mySet.isEmpty());
       //checking if some elements are in set
       System.out.println("Is Igor in set? " + mySet.contains("Igor"));
       System.out.println("Is Johnny in set? "+ mySet.contains("Johnny"));
       //deleting all elements from the set
       mySet.clear();
       System.out.println("Is mySet empty now? " + mySet.isEmpty());

   }
}
ผลลัพธ์ของโปรแกรมอยู่ที่นี่:
[Alex, Igor, Stuart, Tanya, Johnny, Ivy] [Alex, Tanya, Johnny, Ivy] [Alex, Dasha, Tanya, Johnny, Ivy] ปริมาณขององค์ประกอบของชุด = 5 mySet ว่างเปล่าหรือไม่ False อิกอร์อยู่ในชุดหรือไม่ False จอห์นนี่อยู่ในกองถ่ายไหม mySet ว่างเปล่าตอนนี้หรือไม่ จริง

ตัวอย่างด้วย LinkedHashSet และตั้งค่าเป็น Array

มาเขียนโปรแกรมกันอีก ในนั้น เราจะสร้างชุดตาม LinkedHashSet เพิ่มองค์ประกอบเข้าไป แล้วแปลงชุดเป็นอาร์เรย์

import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Set;
   public class LinkedHashSet3 {
       public static void main(String[] args) {
           Set<String> set = new LinkedHashSet<>();
           set.add("C");
           set.add("D");
           set.add("E");
           set.add("F");
           set.add("G");
           set.add("A");
           set.add("B");
           System.out.println(set);
           set.remove("F");// removing an element from our set
           set.remove("C sharp");//trying to remove element that isn't in set
           System.out.println(set.remove("C sharp"));
           System.out.println("Print our set with elements removed: ");
           System.out.println(set);

//set to array
           String strArray[] = set.toArray(new String[set.size()]);
           System.out.println("New Array from set: ");
           System.out.println(Arrays.toString(strArray));
           System.out.println(strArray[0]);

       }
   }
นี่คือผลลัพธ์ของโปรแกรม:
[C, D, E, F, G, A, B] เท็จ พิมพ์ชุดของเราโดยเอาองค์ประกอบออก: [C, D, E, G, A, B] อาร์เรย์ใหม่จากชุด: [C, D, E, G, ก, ข] ค

ตั้งค่าตัวอย่างด้วย iterator

มาสร้างชุด แล้วพิมพ์ออกมาโดยใช้ตัววนซ้ำ แล้วลบเลขคู่ทั้งหมดออกจากชุดนั้น โดยใช้ตัววนซ้ำด้วย

import java.util.*;

public class SetTest5
{
   public static void main(String[] args)
   {

       Set<Integer> mySet = new HashSe<>();
       for(int i = 0; i < 10; i++)
           mySet.add(i);

       Iterator iterator = mySet.iterator();

       //simple iteration
       while(iterator.hasNext()){
           int i = (int) iterator.next();
       }
       System.out.println(" " + mySet);

       //modification of mySet using iterator - removing all even numbers
       iterator = mySet.iterator();
       while(iterator.hasNext()){
           int x = (int) iterator.next();
           if(x%2 == 0) iterator.remove();
       }
       System.out.println(mySet);

       }
}
ผลลัพธ์ของโปรแกรมอยู่ที่นี่:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [1, 3, 5, 7, 9

ตัวอย่างด้วย TreeSet

หากการเรียงลำดับมีความสำคัญต่อคุณ ให้ใช้TreeSet Implement ในตัวอย่างสั้นๆ นี้ เราจะเติมชุดด้วยชื่อเพื่อนดังตัวอย่างที่แล้ว อย่างไรก็ตาม ในTreeSet ที่เรียงลำดับ องค์ประกอบจะถูกเขียนตามลำดับการจัดเรียงทันที ในกรณีนี้ ชื่อจะแสดงตามตัวอักษร

import java.util.Set;
import java.util.TreeSet;
public class TreeSetTest {

   public static void main(String[] args) {

       Set mySet = new TreeSet<>();
       mySet.add("Stuart");
       mySet.add("Alex");
       mySet.add("Johnny");
       mySet.add("Igor");
       mySet.add("Bel");
       System.out.println(mySet);

   }
ผลลัพธ์คือ:
[อเล็กซ์ เบล อิกอร์ จอห์นนี่ สจวร์ต]

ข้อสรุปสั้น ๆ

  • อินเทอร์เฟซ Java Setเป็นส่วนหนึ่งของ Java Collections Framework

  • คลาสที่นำไปใช้: AbstractSet , ConcurrentHashMap.KeySetView , ConcurrentSkipListSet , CopyOnWriteArraySet , EnumSet , HashSet , JobStateReasons , LinkedHashSet , TreeSet

  • การใช้ งานSetที่ได้รับความนิยมมากที่สุดคือHashSet , LinkedHashSetและTreeSet

  • ลำดับองค์ประกอบ HashSetถูกกำหนดโดยอัลกอริทึมที่ซับซ้อน หากลำดับการจัดเก็บมีความสำคัญต่อคุณ ให้ใช้ คอนเทนเนอร์ TreeSetซึ่งจัดเก็บอ็อบเจ็กต์ที่เรียงลำดับจากน้อยไปมากในลำดับการเปรียบเทียบ หรือLinkedHashSetซึ่งจัดเก็บองค์ประกอบในลำดับเพิ่มเติม

  • ส่วนใหญ่มักใช้ชุดเพื่อทดสอบการเป็นสมาชิก นั่นคือเพื่อตรวจสอบว่าวัตถุเป็นของชุดที่กำหนดในความหมายทางคณิตศาสตร์หรือไม่ ในทางปฏิบัติส่วนใหญ่แล้ว การใช้งาน Set ทั้งหมดมัก จะเลือกHashSet การใช้งานนี้ได้รับการปรับให้เหมาะสมสำหรับการค้นหาที่รวดเร็ว

  • คุณไม่สามารถเพิ่มองค์ประกอบที่ซ้ำกันในชุด ดังนั้นคุณสามารถใช้การใช้งาน อินเทอร์เฟซ ชุดเพื่อจัดเก็บองค์ประกอบที่ไม่ซ้ำกัน

  • ชุดอนุญาตให้คุณเพิ่มองค์ประกอบว่างเพียงรายการเดียว

  • ชุดไม่ใช่รายการและไม่รองรับดัชนีหรือตำแหน่งขององค์ประกอบ