Java – Set 的介紹及應用
閱讀時間: 10分鐘
Set是一個Interface。
有最簡單的Collection資料結構 - 集合。
Set 唯一的限制是不允許重覆的物件存在。
所以當你不想有相同的物件出現,就可以選擇用Set,同時選擇合適的實作。
Set常用的實作主要有3個:
• LinkedHashSet
保證裡面元素存放的順序與新增時相同。最適合拿來存放由資料庫中存取的資料集。
• HashSet
讀取特快,但不保證存放元素的順序。
• TreeSet
依物件大小來決定集合裡面的順序。所以存放於TreeSet中元素必需是(實作) Comparable的物件。有時候當從自料庫中存取的資料必需自行排序時,就會用到。
例子解釋:
檢查字串(String)有多少個單字不重複。
import java.util.*; /*英文字數計算*/ public class EnglishWordCount { public static void main(String[] args) { String line = input("請輸入一段英文:"); Set<String> words = tokens(line); System.out.printf("結果: 沒有重複的單字有%d個 = %s%n", words.size(), words); } /*英文文字輸入*/static String input(String prompt) { System.out.print(prompt); Scanner scanner = new Scanner(System.in); String line = scanner.nextLine(); return line; } /*切割文字,實作使用LinkedHashSet儲存 */ static Set<String> tokens(String line) { String[] tokens = line.split(" "); Set<String> words = new LinkedHashSet <>(); for(String token : tokens) { words.add(token); } return words; } }
程式詳解:
首先由於String line = input("請輸入一段英文:");,所以會直接跑Method input(),而在input()內,會直接輸出那段文字 “請輸入一段英文:”,之後就要求你輸入一段交字。而你所輸入的文字會儲存在一個類型為String 名字是line內。
然而下一句code是Set words = tokens(line);,
這表剛剛輸入的文字會被轉移存在另一個變數”words”,而words是一個Set,可以不允許重覆的物件存在。
而在轉到”words”之前,其實它已經觸動到Method tokens(),所以會去跑token()。
在token()內,那段文字會先被split(切割),以”空白”來區分每個英文文字,之後再儲存在一個名為tokens的String array。
再說明一下,由於Set只是interface,所以必須實作,而這次是實作LinkedHashSet。
主要目的是保證裡面元素存放的順序與新增時相同。
接著透過for loop將token array的資料轉移到words,最後return words(即是最後結果)出去。
結果是什麼 ?
大家可以自行複雜上面的代碼去測試一下。
另外,3個set的實作都有不同功能,你可以根據你的實際需要而作出最佳選擇。