java中如何将列表转换为集合

时间:2020-02-23 14:35:03  来源:igfitidea点击:

在本教程中,我们将看到如何在java中将列表转换为集合.我们将转换为hashset。

由于HashSet不允许重复,当您将ArrayList转换为HashSet时,所有重复项都将被丢弃。

我们可以简单地使用HashSet的构造函数将ArrayList转换为HashSet。

HashSet set=new HashSet(list);

这是一个简单的例子:

package org.igi.theitroad;
 
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
 
public class ListToSetMain {
 
	public static void main(String args[])
	{
		List<String> listofCountries=new ArrayList<>();
		listofCountries.add("Netherlands");
		listofCountries.add("China");
		listofCountries.add("Bhutan");
		listofCountries.add("Nepal");
		listofCountries.add("Netherlands");
		
		System.out.println("=======================");
		System.out.println("List of Countries: ");
		System.out.println("=======================");
		for(String country:listofCountries)
		{
			System.out.println(country);
		}
		
		//Converting list to set
		Set<String> countriesSet=new HashSet<String>(listofCountries);
		System.out.println("=======================");
		System.out.println("Set of Countries: ");
		System.out.println("=======================");
		for(String country:countriesSet)
		{
			System.out.println(country);
		}
	}
}

运行上面的程序时,我们将得到以下输出

=======================
List of Countries:
=======================
Netherlands
China
Bhutan
Nepal
Netherlands
=======================
Set of Countries:
=======================
Bhutan
China
Nepal
Netherlands

Java 8符合示例列表

我们可以使用Java 8 Stream API将列表转换为设置。

//Converting list to set in java 8
		Set<String> countriesSet=listofCountries.stream().collect(Collectors.toCollection(HashSet::new));

只需更改ListToSetMain.java的第29行,我们将获得相同的输出。

列出以在自定义对象的情况下设置

当我们转换要设置的自定义对象列表时,我们需要非常小心。
让我们在简单的例子的帮助下了解:

创建一个名为"country"的类。
我们将把此类的对象放在列表中,然后将其转换为列表。

package org.igi.theitroad;
 
public class Country {
	
	String name;
	long population;
	
	public Country(String name, long population) {
		super();
		this.name = name;
		this.population = population;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public long getPopulation() {
		return population;
	}
	public void setPopulation(long population) {
		this.population = population;
	}
	@Override
	public String toString() {
		return "Country [name=" + name + ", population=" + population + "]";
	}
}

创建一个名为listtosetcustomobjectmain的类:

package org.igi.theitroad;
 
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
 
public class ListToSetCustomObjectMain {
 
	public static void main(String args[])
	{
		List<Country> listofCountries=new ArrayList<>();
		listofCountries.add(new Country("Netherlands",20000));
		listofCountries.add(new Country("China",30000));
		listofCountries.add(new Country("Bhutan",1000));
		listofCountries.add(new Country("Nepal",3000));
		listofCountries.add(new Country("Netherlands",20000));
		
		System.out.println("=======================");
		System.out.println("List of Countries: ");
		System.out.println("=======================");
		for(Country country:listofCountries)
		{
			System.out.println(country);
		}
		
		//Converting list to set
		Set<Country> countriesSet=new HashSet<Country>(listofCountries);
		System.out.println("=======================");
		System.out.println("Set of Countries: ");
		System.out.println("=======================");
		for(Country country:countriesSet)
		{
			System.out.println(country);
		}
	}
}

运行上面的程序时,我们将得到以下输出:

=======================
List of Countries:
=======================
Country [name=Netherlands, population=20000]
Country [name=China, population=30000]
Country [name=Bhutan, population=1000]
Country [name=Nepal, population=3000]
Country [name=Netherlands, population=20000]
=======================
Set of Countries:
=======================
Country [name=Netherlands, population=20000]
Country [name=Nepal, population=3000]
Country [name=Netherlands, population=20000]
Country [name=Bhutan, population=1000]
Country [name=China, population=30000]

如我们所见,我们在输出中有国家[Name = Netherlands,人口= 20000],但这些是重复的条目,但HashSet不会将其视为重复。
你知道为什么吗?
因为我们没有实施Hashcode并等于Methodin国家程序。

让我们将以下方法添加到国家程序。

@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		result = prime * result + (int) (population ^ (population >>> 32));
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Country other = (Country) obj;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		if (population != other.population)
			return false;
		return true;
	}

添加以下两种方法后再次运行上面的程序时。
我们将得到以下输出:

=======================
List of Countries:
=======================
Country [name=Netherlands, population=20000]
Country [name=China, population=30000]
Country [name=Bhutan, population=1000]
Country [name=Nepal, population=3000]
Country [name=Netherlands, population=20000]
=======================
Set of Countries:
=======================
Country [name=Netherlands, population=20000]
Country [name=Nepal, population=3000]
Country [name=China, population=30000]
Country [name=Bhutan, population=1000]