วิธีแปลง Set <String> เป็น String []


281

ฉันต้องการString[]ออกจาก a Set<String>แต่ฉันไม่รู้ว่าจะทำอย่างไร ล้มเหลวต่อไปนี้:

Map<String, ?> myMap = gpxlist.getAll();
Set<String> myset = myMap.keySet();
String[] GPXFILES1 = (String[]) myset.toArray(); // Here it fails.

ฉันจะแก้ไขให้มันทำงานได้อย่างไร


5
ด้วยtoArray()วิธีการที่ระบุไว้อย่างชัดเจนใน Javadoc
มาร์ควิสแห่ง Lorne

1
โซลูชัน Java 8: stackoverflow.com/questions/5982447/…
akhil_mittal

Java 11: การใช้toArray()วิธีการเริ่มต้นใหม่stackoverflow.com/a/32179686/1216775
akhil_mittal

คำตอบ:


461

ใช้ Set#toArray(T[])วิธีการโต้แย้งอาเรย์ที่พิมพ์ขนาดเดียวกัน

String[] GPXFILES1 = myset.toArray(new String[myset.size()]);

สามารถใช้ขนาดที่แตกต่างกันได้ แต่นั่นจะบังคับให้toArray()วิธีการสร้างอาร์เรย์ใหม่เพื่อส่งคืนแทนที่จะนำอาร์กิวเมนต์ที่ให้มากลับมาใช้ซ้ำซึ่งอาจทำให้มีประสิทธิภาพน้อยลง

ดูเพิ่มเติมรหัสที่มาของAbstractCollection#toArray()


5
นอกจากนี้คุณยังสามารถระบุอาร์เรย์ขนาด 0: String[] GPXFILES1 = myset.toArray(new String[0]);
sactiw

1
@ sactiw: นั่นครอบคลุมโดยคำตอบอื่น ๆ แล้ว อ่านความคิดเห็นในคำตอบอื่น ๆ ว่าทำไมถึงไม่แนะนำ
BalusC

8
จาก Java 7 เราสามารถใช้String[] GPXFILES1 = myset.toArray(new String[0])และที่แนะนำ อัปเดตคำตอบ "ตั้งแต่การอัปเดตล่าสุดของ OpenJDK 6 การเรียกนี้ถูกทำให้เป็นจริงทำให้ประสิทธิภาพของอาเรย์รุ่นที่ว่างเหมือนกันและบางครั้งก็ดีขึ้นเมื่อเทียบกับรุ่นก่อนขนาด การแข่งขันข้อมูลเป็นไปได้ระหว่างขนาดและการเรียก toArray ซึ่งอาจส่งผลให้มีค่า Null พิเศษในตอนท้ายของอาร์เรย์ - เสนอราคาโดยชุมชน Java
Chaitanya

6
การเผชิญหน้ากับคำตอบนี้ก่อนจากนั้นจึงทำการค้นคว้าเพิ่มเติมมีหลักฐานสนับสนุนว่าความคิดเห็นข้างต้นนั้นถูกต้อง และคำตอบที่ยอมรับนั้นล้าสมัย ใช้การเชื่อมโยงตัวอย่างเหล่านี้สำหรับสิ่งที่คุณจะ: stackoverflow.com/questions/9863742/...และการเชื่อมโยงจากที่โพสต์ SO shipilev.net/blog/2016/arrays-wisdom-ancients
RMSD

60

Java 11

toArrayวิธีการเริ่มต้นใหม่ในCollectionอินเตอร์เฟซช่วยให้องค์ประกอบของคอลเลกชันจะถูกโอนไปยังอาร์เรย์ที่สร้างขึ้นใหม่ของประเภทรันไทม์ที่ต้องการ มันต้องใช้เวลาIntFunction<T[]> generatorเป็นอาร์กิวเมนต์และสามารถใช้เป็น:

 String[] array = set.toArray(String[]::new);

มีวิธีการที่คล้ายกันอยู่แล้วCollection.toArray(T[])และการเพิ่มนี้หมายความว่าเราไม่สามารถผ่านได้อีกต่อไปnullโต้แย้งเพราะในกรณีนั้นการอ้างอิงถึงวิธีนั้นจะคลุมเครือ แต่มันก็ยังไม่เป็นไรเพราะทั้งสองวิธีมี NPE อยู่แล้ว

Java 8

ใน Java 8 เราสามารถใช้ API สตรีม:

String[] array = set.stream().toArray(String[]::new);

นอกจากนี้เรายังสามารถใช้ประโยชน์จากtoArray ()รุ่นที่โอเวอร์โหลดซึ่งใช้IntFunction<A[]> generatorเป็น:

String[] array = set.stream().toArray(n -> new String[n]);

วัตถุประสงค์ของฟังก์ชั่นเครื่องกำเนิดไฟฟ้าที่นี่คือการใช้จำนวนเต็ม (ขนาดของอาเรย์ที่ต้องการ) และสร้างอาเรย์ของขนาดที่ต้องการ ฉันชอบวิธีการเดิมโดยใช้การอ้างอิงวิธีการกว่าวิธีภายหลังโดยใช้การแสดงออกแลมบ์ดา


คุณไม่จำเป็นที่จะใช้stream() toArray()อาจเป็นได้set.toArray(new String[0])
Jakub Pomykała

1
@ JakubPomykałaจริง ๆ แล้วไม่ดี เมื่อคุณกำหนดขนาดที่ไม่ถูกต้องภายในฟังก์ชันนั้นจะต้องใช้การสะท้อนเพื่อให้ได้ขนาดที่ถูกต้อง หากจำเป็นต้องใช้วิธีนี้ให้ทำset.toArray(new String[set.size()]);
Debosmit Ray

42

ใช้ วิธี toArray (T [] a) :

String[] array = set.toArray(new String[0]);

26
เมื่อคุณส่งผ่านไปยังอาเรย์ () อาเรย์ที่มีขนาดเล็กเกินไปเมธอด toArray () จะต้องสร้างอาเรย์ใหม่ที่มีขนาดที่เหมาะสมโดยใช้การสะท้อน สิ่งนี้มีประสิทธิภาพที่แย่กว่าการส่งผ่านอย่างน้อยขนาดของคอลเลกชันเอง ดังนั้น[0]ควรแทนที่ด้วย[myset.size()]เหมือนในคำตอบที่ยอมรับ
k2col

10
@ k2col ดูเหมือนว่าขณะนี้set.toArray(new String[0])มีประสิทธิภาพที่ดีกว่าset.toArray(new String[set.size()]
Xam

1
ตั้งแต่ Java 7 นี่เป็นวิธีการที่แนะนำ ดูความคิดเห็นนี้
acdcjunior


2

ใน Java 11 เราสามารถใช้Collection.toArray(generator)วิธีการ รหัสต่อไปนี้จะสร้างอาร์เรย์ใหม่ของสตริง:

Set<String> set = Set.of("one", "two", "three");
String[] array = set.toArray(String[]::new)

ดู: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Collection.html#toArray(java.util.function.IntFunction)


1
Set<String> stringSet= new HashSet<>();
String[] s = (String[])stringSet.toArray();

0

ฉันกำลังเผชิญกับสถานการณ์เดียวกัน

ฉันเริ่มต้นด้วยการประกาศโครงสร้างที่ฉันต้องการ:

Set<String> myKeysInSet = null; String[] myArrayOfString = null;

ในกรณีของฉันฉันมีวัตถุ JSON และฉันต้องการคีย์ทั้งหมดใน JSON นี้เพื่อเก็บไว้ในอาร์เรย์ของสตริง ใช้ห้องสมุด GSONฉันใช้ JSON.keySet () เพื่อรับกุญแจและย้ายไปยังชุดของฉัน:

myKeysInSet = json_any.keySet();

ด้วยสิ่งนี้ฉันมีโครงสร้างชุดพร้อมปุ่มทั้งหมดตามที่ฉันต้องการ ดังนั้นฉันแค่ต้องการค่าของ Array of Strings ดูรหัสด้านล่าง:

myArrayOfString = myKeysInSet.toArray(new String[myKeysInSet.size()]);

นี่เป็นคำตอบแรกของฉันใน StackOverflow ขออภัยสำหรับข้อผิดพลาด: D

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.