ฉันกำลังมองหาวิธีง่ายๆในการสร้างชุด
Arrays.asList("a", "b" ...)
สร้างไฟล์ List<String>
มีอะไรที่คล้ายกันสำหรับSet
?
ฉันกำลังมองหาวิธีง่ายๆในการสร้างชุด
Arrays.asList("a", "b" ...)
สร้างไฟล์ List<String>
มีอะไรที่คล้ายกันสำหรับSet
?
คำตอบ:
การใช้Guavaนั้นทำได้ง่ายๆดังนี้:
Set<String> mySet = ImmutableSet.<String> of("a", "b");
หรือสำหรับชุดที่ไม่แน่นอน:
Set<String> mySet = Sets.newHashSet("a", "b")
สำหรับประเภทข้อมูลเพิ่มเติมโปรดดูคู่มือผู้ใช้ Guava
Sets.newHashSet("a", "b")
หรือSets.newLinkedHashSet("a", "b")
Sets.newLinkedHashSet()
ไม่มีลายเซ็นนั้นขออภัย
Set<String> mySet = ImmutableSet.of("a", "b");
คุณสามารถใช้
new HashSet<String>(Arrays.asList("a","b"));
สำหรับกรณีพิเศษของเซตที่มีสมาชิกเป็นศูนย์หรือหนึ่งคนคุณสามารถใช้:
java.util.Collections.EMPTY_SET
และ:
java.util.Collections.singleton("A")
java.util.Collections.emptySet()
คือในใจของฉันชอบมากกว่า EMPTY_SET เนื่องจากความปลอดภัยของประเภท จากความคิดเห็นในชั้นเรียน Collections:Unlike the like-named field, this method is parameterized.
ตามที่คนอื่น ๆ กล่าวไว้ให้ใช้:
new HashSet<String>(Arrays.asList("a","b"));
เหตุผลนี้ไม่ได้มีอยู่ใน Java คือว่าArrays.asList
ผลตอบแทนที่เป็นรายการที่มีขนาดคงที่ในคำอื่น ๆ :
public static void main(String a[])
{
List<String> myList = Arrays.asList("a", "b");
myList.add("c");
}
ผลตอบแทน:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(Unknown Source)
at java.util.AbstractList.add(Unknown Source)
ไม่มีการใช้ JDK ของ "ขนาดคงที่" Set
ภายในArrays
คลาส ทำไมคุณถึงต้องการสิ่งนี้? A Set
รับประกันว่าไม่มีรายการที่ซ้ำกัน แต่ถ้าคุณพิมพ์ด้วยมือคุณไม่ควรใช้ฟังก์ชันนั้น ... และList
มีวิธีการเพิ่มเติม อินเทอร์เฟซทั้งสองขยายCollection
และIterable
.
อย่างที่คนอื่นบอกให้ใช้guavaถ้าคุณต้องการฟังก์ชั่นนี้จริงๆ - เนื่องจากไม่ได้อยู่ใน JDK ดูคำตอบของพวกเขา (โดยเฉพาะคำตอบของ Michael Schmeißer) เพื่อดูข้อมูลนั้น
ใน Java 9 มีการเพิ่มฟังก์ชันที่คล้ายกันผ่านวิธีการของโรงงาน:
Set<String> oneLinerSet = Set.of("a", "b", ...);
(มีค่าเทียบเท่าList
เช่นกัน)
ไม่ แต่คุณสามารถทำได้เช่นนี้
new HashSet<String>(Arrays.asList("a", "b", ...));
นี่เป็นวิธีการเล็กน้อยที่คุณสามารถใช้ได้
/**
* Utility method analogous to {@link java.util.Arrays#asList(Object[])}
*
* @param ts
* @param <T>
* @return the set of all the parameters given.
*/
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> Set<T> asSet(T... ts) {
return new HashSet<>(Arrays.asList(ts));
}
อีกวิธีหนึ่งในการใช้ Java 8 และ enums ก็คือ:
Set<String> set = EnumSet.of(StandardOpenOption.CREATE, StandardOpenOption.READ);
ฉันอยากจะแนะนำการวิเคราะห์ประสิทธิภาพระหว่างแนวทางนี้และ
Set<String> set = Stream.of(StandardOpenOption.CREATE, StandardOpenOption.READ).collect(Collectors.toSet());
เพราะถ้าคุณมีมากกว่าห้าองค์ประกอบ Javadoc ของรัฐที่วิธีการที่อาจจะมีปัญหาเรื่องประสิทธิภาพในขณะที่คุณสามารถมองเห็นใน Javadoc ของSet.Of (E, E ... )