Java Set – Java 中的 Set

Java Set是一個包含沒有重複元素(或對象)的元素集合。Java Set是擴展Collection接口的接口。與List不同,Java Set不是有序集合,它的元素沒有特定的順序。Java Set不提供控制插入元素的位置。您無法通過索引訪問元素,也無法在列表中搜索元素。

Java Set

在這一節中,我們將討論Java Set的一些重要點:

  • Java Set接口是Java Collections Framework的成員。
  • 與List不同,Set 不允許 添加重複元素。
  • Set允許添加最多一個null元素。
  • Java 8的Set接口有一個默認方法:spliterator。
  • 與List和數組不同,Set不支持其元素的索引或位置。
  • Set支持泛型,我們應該在可能的情況下使用它。使用泛型與Set將避免運行時的ClassCastException。
  • 我們可以使用Set接口的實現來維護唯一元素。

Java Set 類別圖

Java Set 介面擴展 Collection 介面。Collection 介面擴展 Iterable 介面。一些常用的 Set 實現類別包括 HashSet、LinkedHashSet、TreeSet、CopyOnWriteArraySet 和 ConcurrentSkipListSet。AbstractSet 提供了 Set 介面的骨架實現,以減少實現 Set 時的工作量。

Java Set 方法

在這一部分中,我們將討論一些有用的 Java Set 方法:

  1. int size(): 獲取 Set 中元素的數量。
  2. boolean isEmpty(): 檢查 Set 是否為空。
  3. boolean contains(Object o): 如果此 Set 包含指定的元素則返回 true。
  4. Iterator iterator(): 返回此集合中元素的迭代器。元素以無特定順序返回。
  5. Object[] toArray(): 返回包含此集合中所有元素的數組。如果此集合對其元素返回的順序有任何保證,則此方法必須按相同順序返回元素。
  6. boolean add(E e): 如果指定的元素尚未存在於此集合中,則將其添加到此集合(可選操作)。
  7. boolean remove(Object o): 如果存在,則從此集合中刪除指定的元素(可選操作)。
  8. boolean removeAll(Collection c): 從此集合中刪除包含在指定集合中的所有元素(可選操作)。
  9. boolean retainAll(Collection c): 保留此集合中僅包含在指定集合中的元素(可選操作)。
  10. void clear(): 從集合中刪除所有元素。
  11. Iterator iterator(): 返回此集合中元素的迭代器。

Java陣列轉為集合

與List不同,我們無法將Java Set直接轉換為陣列,因為它並非使用陣列實現。因此,我們無法使用Arrays類來將陣列視為集合。我們可以採用另一種方法。我們可以使用Arrays.asList()方法將陣列轉換為List,然後使用它來創建一個Set。通過使用此方法,我們可以以兩種方式將Java陣列轉換為Set。讓我們使用一個簡單的示例來逐一討論它們。 方法一 在此方法中,首先我們需要使用給定的陣列創建一個List,然後使用它來創建一個Set,如下所示。

import java.util.*;

public class ArrayToSet {
   public static void main(String[] args) {
		
	String[] vowels = {"a","e","i","o","u"};
		
	Set<String> vowelsSet = new HashSet>(Arrays.asList(vowels));
	System.out.println(vowelsSet);
	
	/**
	 * Unlike List, Set is NOt backed by array, 
	 * so we can do structural modification without any issues.
	 */
	vowelsSet.remove("e");
	System.out.println(vowelsSet);
	vowelsSet.clear();
	System.out.println(vowelsSet);
   }
}

方法-2 在這種方法中,我們不使用中間列表來從陣列創建一個集合。首先創建一個空的 HashSet,然後使用 Collections.addAll() 方法將陣列元素複製到給定的集合中,如下所示。

import java.util.*;

public class ArrayToSet2 {
   public static void main(String[] args) {
		
	String[] vowels = {"a","e","i","o","u"};
		
	Set<String> vowelsSet = new HashSet<>();
	Collections.addAll(vowelsSet, vowels); 
	System.out.println(vowelsSet);

	/** 
	 * Unlike List, Set is NOt backed by array, 
	 * so we can do structural modification without any issues.
	 */
	vowelsSet.remove("e");
	System.out.println(vowelsSet);
	vowelsSet.clear();
	System.out.println(vowelsSet);
   }
}

輸出:- 當我們運行上述兩個程式時,將獲得如下所示的相同輸出。

[a, e, u, i, o]
[a, u, i, o]
[]

Java Set 轉 Array

在這一節中,我們將編寫一個程式,使用 Set.toArray() 方法將一組字符串轉換為字符串數組,如下所示。

import java.util.*;

public class SetToArray {
   public static void main(String[] args) {
	Set();

	// 添加示例
	vowelsSet.add("a");
	vowelsSet.add("e");
	vowelsSet.add("i");
	vowelsSet.add("o");
	vowelsSet.add("u");
		
	// 將集合轉換為數組
	String strArray[] = vowelsSet.toArray(new String[vowelsSet.size()]);
	System.out.println(Arrays.toString(strArray)); 
   }
}

輸出:- 當我們運行上述程式時,將獲得如下所示的輸出。

[a, e, u, i, o]

Java Set 排序

正如我們所知,集合(HashSet)不支持直接對元素進行排序。它存儲和顯示其元素的順序是隨機的。然而,我們有一些方法來對其元素進行排序,如下所示:

import java.util.*;

public class SetSortingExample {

	public static void main(String[] args) {
		Set<Integer> intsSet = new HashSet<>();
		Random random = new Random();
		for (int i = 0; i  {return (o2-o1);});
		System.out.println("Reverse Sorting: " + intsList2);

		// Approach-3
		Set<Integer> sortedSet = new TreeSet<>(intsSet);
		System.out.println("Sorted Set: " + sortedSet);
	}
}

輸出:- 當我們運行上述程式時,將看到以下輸出。

[560, 864, 176, 657, 135, 103, 40, 123, 555, 589]
Natural Sorting: [40, 103, 123, 135, 176, 555, 560, 589, 657, 864]
Before Sorting: [560, 864, 176, 657, 135, 103, 40, 123, 555, 589]
Reverse Sorting: [864, 657, 589, 560, 555, 176, 135, 123, 103, 40]
Sorted Set: [40, 103, 123, 135, 176, 555, 560, 589, 657, 864]

Java Set 常見操作

Java Set 上最常見的操作包括 add、addAll、clear、size 等。以下是一個簡單的 Java Set 示例,展示了常見方法的使用。

import java.util.*;

public class SetCommonOperations 
{
   public static void main(String args[]) 
   {
	Set vowels= new HashSet<>();
		
	//add 示例
	vowels.add("A");
	vowels.add("E");
	vowels.add("I");

	//我們無法按索引向 Set 中插入元素
	System.out.println(vowels);
		
	Set set = new HashSet<>();
	set.add("O");
	set.add("U");
	
	//將集合元素附加到 letters
	vowels.addAll(set);
	System.out.println(vowels);
	
	//清空集合的示例
	set.clear();
		
	//size 示例
	System.out.println("letters set size = " + vowels.size());
		
	vowels.clear();
	vowels.add("E"); vowels.add("E");vowels.add("I"); vowels.add("O");
	System.out.println("Given set contains E element or not? = " + vowels.contains("E"));
		
   }
}

輸出:

[A, E, I]
[A, E, U, I, O]
letters set size = 5
Given set contains E element or not? = true

Java Set 迭代器

以下是一個簡單的示例,展示了如何遍歷 Java Set。

import java.util.*;

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

	Set set = new HashSet<>();
	for(int i=0; i<5; i++) 
		set.add(i);
		
	Iterator iterator = set.iterator();
	
	//簡單遍歷
	while(iterator.hasNext()){
		int i = (int) iterator.next();
		System.out.print(i + ", ");
	}
	System.out.println("\n" + set);
	
	//使用迭代器修改集合
	iterator = set.iterator();
	while(iterator.hasNext()){
		int x = (int) iterator.next();
		if(x%2 ==0) iterator.remove();
	}
	System.out.println(set);
		
	//在迭代時更改集合結構
	iterator = set.iterator();
	while(iterator.hasNext()){
                //這裡會出現 ConcurrentModificationException
		int x = (int) iterator.next(); 
		if(x==1) set.add(10);
	}
   }
}

Java Set 轉 Stream

以下是一個簡單的示例,展示了如何將 Java Set 轉換為 Stream 並根據我們的需求執行一些操作。

import java.util.*;

public class SetToStream {

   public static void main(String[] args) {
	Set vowelsSet = new HashSet<>();
	// add 示例
	vowelsSet.add("a");
	vowelsSet.add("e");
	vowelsSet.add("i");
	vowelsSet.add("o");
	vowelsSet.add("u");
		
	//將集合轉換為流
	vowelsSet.stream().forEach(System.out::println);
   }
}

輸出:

a
e
u
i
o

Java SE 9 Set

在Java SE 9版本中,Oracle Corp將向Set介面添加一些有用的實用方法。最好通過一些簡單有用的示例來理解它們。請參閱我在“Java SE 9:Set工廠方法”中的教程以學習它們。這就是關於Java中Set的一個快速概述。希望這些Java Set示例能幫助您開始使用Set集合編程。感謝您閱讀我的教程。如果您喜歡我的教程或有任何問題、建議或任何類型的錯誤,請給我留言。

Source:
https://www.digitalocean.com/community/tutorials/java-set