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);
}
}
นี่คือผลลัพธ์ของโปรแกรม:
วิธีการตั้งค่า Java
ต่อไปนี้เป็นวิธีการที่สำคัญของ Java Set :-
บูลีนบวก(E e) . เพิ่มองค์ประกอบที่ระบุให้กับชุดหากยังไม่มีอยู่ (การดำเนินการทางเลือก)
-
บูลีนลบ (วัตถุ o ) ลบองค์ประกอบที่ระบุออกจากชุดนี้หากมีอยู่ (การดำเนินการเพิ่มเติม)
-
บูลีน removeAll (Collection c) ลบองค์ประกอบทั้งหมดที่มีอยู่ในคอลเลกชันที่ระบุออกจากชุดนี้ (การดำเนินการทางเลือก)
-
บูลีนretainAll(Collection c ) เก็บเฉพาะองค์ประกอบในชุดนี้ที่มีอยู่ในคอลเลกชันที่ระบุ (การดำเนินการทางเลือก)
-
เป็นโมฆะชัดเจน ( ) ลบองค์ประกอบทั้งหมดออกจากชุด
-
ตัววนซ้ำ ตัววนซ้ำ ( ) ส่งกลับ iterator เหนือองค์ประกอบในชุดนี้
-
ขนาด int() . ใช้เพื่อรับจำนวนองค์ประกอบในชุด
-
บูลีน isEmpty( ) เพื่อตรวจสอบว่า Set ว่างหรือไม่
-
บูลีนประกอบด้วย (Object o ) คืนค่าจริงหากชุดนี้มีองค์ประกอบที่ระบุ
-
ตัววนซ้ำ ตัววนซ้ำ ( ) ส่งกลับ iterator เหนือองค์ประกอบในชุดนี้ องค์ประกอบจะถูกส่งกลับโดยไม่เรียงลำดับ
-
วัตถุ[] toArray( ) ส่งกลับอาร์เรย์ที่มีองค์ประกอบทั้งหมดในชุดนี้ หากชุดนี้รับประกันว่าองค์ประกอบใดจะถูกส่งกลับโดย iterator วิธีนี้จะต้องส่งคืนองค์ประกอบในลำดับเดียวกัน
ตัวอย่างการดำเนินการหลัก 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());
}
}
ผลลัพธ์ของโปรแกรมอยู่ที่นี่:
ตัวอย่างด้วย 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]);
}
}
นี่คือผลลัพธ์ของโปรแกรม:
ตั้งค่าตัวอย่างด้วย 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);
}
}
ผลลัพธ์ของโปรแกรมอยู่ที่นี่:
ตัวอย่างด้วย 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 การใช้งานนี้ได้รับการปรับให้เหมาะสมสำหรับการค้นหาที่รวดเร็ว
-
คุณไม่สามารถเพิ่มองค์ประกอบที่ซ้ำกันในชุด ดังนั้นคุณสามารถใช้การใช้งาน อินเทอร์เฟซ ชุดเพื่อจัดเก็บองค์ประกอบที่ไม่ซ้ำกัน
-
ชุดอนุญาตให้คุณเพิ่มองค์ประกอบว่างเพียงรายการเดียว
-
ชุดไม่ใช่รายการและไม่รองรับดัชนีหรือตำแหน่งขององค์ประกอบ
GO TO FULL VERSION