Java Set –用Java设置

时间:2020-02-23 14:36:50  来源:igfitidea点击:

Java Set是元素(或者对象)的集合,其中不包含重复的元素。
Java Set是扩展Collection接口的接口。
与List不同,Java Set不是有序集合,它的元素没有特定的顺序。
Java Set不提供对可以插入元素的位置的控制。
您不能按元素索引访问元素,也不能在列表中搜索元素。

Java集

在本节中,我们将讨论有关Java Set的一些重要点:

  • Java Set接口是Java Collections Framework的成员。

  • 与"列表"不同,"设置"不允许您添加重复的元素。

  • Set允许您最多添加一个null元素。

  • Set接口在Java 8中有一个默认方法:spliterator。

  • 与List和数组不同,Set不支持其元素的索引或者位置。

  • 集支持泛型,我们应该尽可能使用它。
    与Set一起使用泛型将避免在运行时出现ClassCastException。

  • 我们可以使用Set接口实现来维护唯一元素。

Java Set类图

Java Set接口扩展了Collection接口。
Collection接口扩展了Iterable接口。
一些常用的Set实现类是HashSet,LinkedHashSet,TreeSet,CopyOnWriteArraySet和ConcurrentSkipListSet。
AbstractSet提供Set接口的基本实现,以减少实现Set的工作量。

Java Set方法

在本节中,我们将讨论一些有用的Java Set方法:

  • int size():获取Set中元素的数量。

  • boolean isEmpty():检查Set是否为空。

  • boolean contains(Object o):如果此Set包含指定的元素,则返回true。

  • Iterator iterator():返回对此集合中的元素进行迭代的迭代器。
    元素以不特定的顺序返回。

  • Object [] toArray():返回包含此集合中所有元素的数组。
    如果此集合保证其迭代器返回其元素的顺序,则此方法必须以相同的顺序返回元素。

  • boolean add(E e):如果指定的元素尚不存在,则将其添加到此集合中(可选操作)。

  • boolean remove(Object o):如果指定的元素存在,则从该集合中移除(可选操作)。

  • boolean removeAll(Collection c):从此集合中删除所有包含在指定集合中的元素(可选操作)。

  • boolean keepAll(Collection c):仅保留此集合中包含在指定集合中的元素(可选操作)。

  • void clear():从集合中删除所有元素。

  • Iterator iterator():返回对此集合中的元素进行迭代的迭代器。

要设置的Java数组

与列表不同,我们无法将Java集直接转换为数组,因为它不是使用数组来实现的。
因此,我们不能使用Arrays类获取设置的数组视图。
我们可以采用另一种方法。
我们可以使用Arrays.asList()方法将数组转换为List,然后使用它创建一个Set。
通过使用这种方法,我们可以通过两种方式隐式设置Java数组。
让我们使用一个简单的示例一个接一个地讨论它们。

方法1在这种方法中,首先我们需要使用给定的数组创建一个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在这种方法中,我们不使用中间List从数组创建Set。
首先创建一个空的HashSet,然后使用Collections.addAll()将数组元素复制到给定的Set中,如下所示。

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.toArray()方法将一组字符串转换为一组字符串,如下所示。

import java.util.*;

public class SetToArray {
 public static void main(String[] args) {
	Set<String< vowelsSet = new HashSet<>();

	//add example
	vowelsSet.add("a");
	vowelsSet.add("e");
	vowelsSet.add("i");
	vowelsSet.add("o");
	vowelsSet.add("u");
		
	//convert Set to Array
	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设置通用操作

在Java Set上执行的最常见操作是add,addAll,clear,size等。
下面是一个简单的Java Set示例,显示了常用方法的用法。

import java.util.*;

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

	//We cannot insert elements based on index to a Set
	System.out.println(vowels);
		
	Set<String> set = new HashSet<>();
	set.add("O");
	set.add("U");
	
	//appending set elements to letters
	vowels.addAll(set);
	System.out.println(vowels);
	
	//clear example to empty the set
	set.clear();
		
	//size example
	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<Integer> set = new HashSet<>();
	for(int i=0; i<5; i++) 
		set.add(i);
		
	Iterator iterator = set.iterator();
	
	//simple iteration
	while(iterator.hasNext()){
		int i = (int) iterator.next();
		System.out.print(i + ", ");
	}
	System.out.println("\n" + set);
	
	//modification of set using iterator
	iterator = set.iterator();
	while(iterator.hasNext()){
		int x = (int) iterator.next();
		if(x%2 ==0) iterator.remove();
	}
	System.out.println(set);
		
	//changing set structure while iterating
	iterator = set.iterator();
	while(iterator.hasNext()){
              //ConcurrentModificationException here
		int x = (int) iterator.next(); 
		if(x==1) set.add(10);
	}
 }
}

Java设置为流

下面是一个简单的示例,显示了如何将Java Set转换为Stream并按照我们的要求执行一些操作。

import java.util.*;

public class SetToStream {

 public static void main(String[] args) {
	Set<String> vowelsSet = new HashSet<>();
	//add example
	vowelsSet.add("a");
	vowelsSet.add("e");
	vowelsSet.add("i");
	vowelsSet.add("o");
	vowelsSet.add("u");
		
	//convert set to stream
	vowelsSet.stream().forEach(System.out::println);
 }
}

输出:

a
e
u
i
o

Java SE 9集

在Java SE 9版本中,Oracle Corp将向Set接口添加一些有用的实用程序方法。
最好通过一些简单而有用的示例来理解它们。