วิธีที่ง่ายที่สุดในการแปลง a List
เป็นSet
in Java คืออะไร?
วิธีที่ง่ายที่สุดในการแปลง a List
เป็นSet
in Java คืออะไร?
คำตอบ:
ฉันเห็นด้วยกับ sepp2k แต่มีรายละเอียดอื่น ๆ ที่อาจมีความสำคัญ:
new HashSet<Foo>(myList);
จะให้ชุดที่ไม่เรียงลำดับซึ่งไม่มีการทำซ้ำ ในกรณีนี้การทำซ้ำจะถูกระบุโดยใช้วิธี. equals () บนวัตถุของคุณ ซึ่งทำร่วมกับเมธอด. hashCode () (สำหรับข้อมูลเพิ่มเติมเกี่ยวกับความเท่าเทียมดูที่นี่ )
ทางเลือกที่ให้ชุดเรียงเป็น:
new TreeSet<Foo>(myList);
สิ่งนี้จะทำงานได้ถ้า Foo ใช้การเปรียบเทียบได้ หากไม่เป็นเช่นนั้นคุณอาจต้องการใช้เครื่องมือเปรียบเทียบ:
Set<Foo> lSet = new TreeSet<Foo>(someComparator);
lSet.addAll(myList);
สิ่งนี้ขึ้นอยู่กับ comparTo () (จากส่วนต่อประสานที่เปรียบเทียบได้) หรือ compar () (จากตัวเปรียบเทียบ) เพื่อให้แน่ใจว่ามีความเป็นเอกลักษณ์ ดังนั้นถ้าคุณสนใจเรื่องความเป็นเอกลักษณ์ให้ใช้ HashSet หากคุณหลังจากเรียงลำดับแล้วให้พิจารณาชุด TreeSet (โปรดจำไว้ว่า: ปรับให้เหมาะสมในภายหลัง!) หากประสิทธิภาพของเวลาใช้ HashSet หากประสิทธิภาพของพื้นที่มีความสำคัญให้ดูที่ TreeSet โปรดทราบว่าการติดตั้งและแผนที่มีประสิทธิภาพมากขึ้นผ่านทาง Trove (และที่ตั้งอื่น ๆ )
ถ้าคุณใช้ไลบรารีGuava :
Set<Foo> set = Sets.newHashSet(list);
หรือดีกว่า:
Set<Foo> set = ImmutableSet.copyOf(list);
ImmutableSet.of()
เช่น แก้ไข: มันอาจจะไม่เป็นปัจจัยเพราะทุก overloads จะไม่จำเป็น
การใช้ java 8 คุณสามารถใช้สตรีม:
List<Integer> mylist = Arrays.asList(100, 101, 102);
Set<Integer> myset = mylist.stream().collect(Collectors.toSet()));
Set<E> alphaSet = new HashSet<E>(<your List>);
หรือตัวอย่างที่สมบูรณ์
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class ListToSet
{
public static void main(String[] args)
{
List<String> alphaList = new ArrayList<String>();
alphaList.add("A");
alphaList.add("B");
alphaList.add("C");
alphaList.add("A");
alphaList.add("B");
System.out.println("List values .....");
for (String alpha : alphaList)
{
System.out.println(alpha);
}
Set<String> alphaSet = new HashSet<String>(alphaList);
System.out.println("\nSet values .....");
for (String alpha : alphaSet)
{
System.out.println(alpha);
}
}
}
ฉันจะทำการตรวจสอบ Null ก่อนที่จะแปลงเป็นชุด
if(myList != null){
Set<Foo> foo = new HashSet<Foo>(myList);
}
Set<Foo> foo = myList == null ? Collections.emptySet() : new HashSet<Foo>(myList);
คุณสามารถแปลงList<>
เป็นSet<>
Set<T> set=new HashSet<T>();
//Added dependency -> If list is null then it will throw NullPointerExcetion.
Set<T> set;
if(list != null){
set = new HashSet<T>(list);
}
สำหรับ Java 8 มันง่ายมาก:
List < UserEntity > vList= new ArrayList<>();
vList= service(...);
Set<UserEntity> vSet= vList.stream().collect(Collectors.toSet());
new ArrayList<>()
;-)
Java - addAll
set.addAll(aList);
Java - วัตถุใหม่
new HashSet(list)
Java-8
list.stream().collect(Collectors.toSet());
ใช้ Guva
Sets.newHashSet(list)
Apache Commons
CollectionUtils.addAll(targetSet, sourceList);
Java 10
var set = Set.copyOf(list);
อย่าลืมเพื่อนที่ค่อนข้างใหม่ของเรา Java-8สตรีม API หากคุณต้องการรายการ preprocess ก่อนที่จะแปลงเป็นชุดมันจะดีกว่าถ้ามีสิ่งต่อไปนี้:
list.stream().<here goes some preprocessing>.collect(Collectors.toSet());
วิธีที่ดีที่สุดในการใช้ตัวสร้าง
Set s= new HashSet(list);
ใน java 8 คุณสามารถใช้ stream api ::
Set s= list.stream().collect(Collectors.toSet());
มีหลายวิธีที่จะได้รับSet
เป็น:
List<Integer> sourceList = new ArrayList();
sourceList.add(1);
sourceList.add(2);
sourceList.add(3);
sourceList.add(4);
// Using Core Java
Set<Integer> set1 = new HashSet<>(sourceList); //needs null-check if sourceList can be null.
// Java 8
Set<Integer> set2 = sourceList.stream().collect(Collectors.toSet());
Set<Integer> set3 = sourceList.stream().collect(Collectors.toCollection(HashSet::new));
//Guava
Set<Integer> set4 = Sets.newHashSet(sourceList);
// Apache commons
Set<Integer> set5 = new HashSet<>(4);
CollectionUtils.addAll(set5, sourceList);
เมื่อเราใช้มันกลับชุดและตามเอกสาร:Collectors.toSet()
There are no guarantees on the type, mutability, serializability, or thread-safety of the Set returned
ถ้าเราต้องการได้รับHashSet
แล้วเราสามารถใช้ทางเลือกอื่นเพื่อรับชุด (ตรวจสอบset3
)
ด้วย Java 10 ตอนนี้คุณสามารถใช้Set#copyOf
เพื่อแปลง a List<E>
เป็น unmodifiable ได้อย่างง่ายดายSet<E>
:
ตัวอย่าง:
var set = Set.copyOf(list);
เก็บไว้ในใจว่านี่คือการดำเนินการเรียงลำดับและnull
องค์ประกอบที่จะไม่ได้NullPointerException
รับอนุญาตเป็นมันจะโยน
หากคุณต้องการให้มันแก้ไขได้เพียงแค่ส่งมันไปยังการสร้างการSet
ดำเนินการ
โซลูชันที่ยืดหยุ่นของ Java 8 เพิ่มเติมด้วย Optional.ofNullable
Set<Foo> mySet = Optional.ofNullable(myList).map(HashSet::new).orElse(null);
หากคุณใช้Eclipse Collections :
MutableSet<Integer> mSet = Lists.mutable.with(1, 2, 3).toSet();
MutableIntSet mIntSet = IntLists.mutable.with(1, 2, 3).toSet();
MutableSet
อินเตอร์เฟซที่ยื่นออกมาjava.util.Set
ในขณะที่MutableIntSet
อินเตอร์เฟซไม่ได้ นอกจากนี้คุณยังสามารถแปลงIterable
เป็นคลาสที่Set
ใช้จากSets
โรงงาน
Set<Integer> set = Sets.mutable.withAll(List.of(1, 2, 3));
มีคำอธิบายเพิ่มเติมในโรงงานที่ไม่แน่นอนที่มีอยู่ในคอลเลกชัน Eclipse เป็นที่นี่
หากคุณต้องการImmutableSet
จากList
คุณสามารถใช้Sets
โรงงานดังต่อไปนี้:
ImmutableSet<Integer> immutableSet = Sets.immutable.withAll(List.of(1, 2, 3))
หมายเหตุ: ฉันเป็นคอมมิชชันสำหรับ Eclipse Collections
โปรดจำไว้ว่าการแปลงจากรายการเป็นชุดจะลบรายการซ้ำออกจากคอลเลกชันเนื่องจากรายการรองรับรายการซ้ำ แต่ชุดไม่รองรับรายการซ้ำใน Java
การแปลงโดยตรง:วิธีที่ใช้กันทั่วไปและง่ายที่สุดในการแปลงรายการเป็นชุด
// Creating a list of strings
List<String> list = Arrays.asList("One", "Two", "Three", "Four");
// Converting a list to set
Set<String> set = new HashSet<>(list);
Apache Commons Collections:คุณยังสามารถใช้ API ชุดคำสั่งทั่วไปในการแปลงรายการเป็นชุด: -
// Creating a list of strings
List<String> list = Arrays.asList("One", "Two", "Three", "Four");
// Creating a set with the same number of members in the list
Set<String> set = new HashSet<>(4);
// Adds all of the elements in the list to the target set
CollectionUtils.addAll(set, list);
การใช้สตรีม:อีกวิธีคือการแปลงรายการที่กำหนดเป็นสตรีมจากนั้นสตรีมเป็นชุด: -
// Creating a list of strings
List<String> list = Arrays.asList("One", "Two", "Three", "Four");
// Converting to set using stream
Set<String> set = list.stream().collect(Collectors.toSet());
Set
และMap
หนึ่งกำลังใช้;HashSet
มีการสันนิษฐานว่าที่นี่