Làm cách nào để chuyển đổi Đặt <Chuỗi> thành Chuỗi []?


281

Tôi cần phải thoát String[]ra khỏi một Set<String>, nhưng tôi không biết làm thế nào để làm điều đó. Lỗi sau:

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

Làm thế nào tôi có thể sửa nó để nó hoạt động?


5
Với toArray()phương thức được đề cập rõ ràng trong Javadoc.
Hầu tước Lorne

1

Java 11: Sử dụng toArray()phương thức mặc định mới stackoverflow.com/a/32179686/1216775
akhil_mittal

Câu trả lời:


461

Sử dụng Set#toArray(T[])phương thức lấy một đối số mảng được gõ có cùng kích thước.

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

Một kích thước khác cũng có thể được sử dụng, nhưng điều đó sẽ buộc toArray()phương thức tạo một mảng mới trả về thay vì sử dụng lại đối số được cung cấp, điều này có thể sẽ kém hiệu quả hơn.

Xem thêm mã nguồn củaAbstractCollection#toArray() .


5
Bạn cũng có thể chỉ định mảng có kích thước 0: String[] GPXFILES1 = myset.toArray(new String[0]);
sactiw

1
@sactiw: Điều đó đã được bao phủ bởi câu trả lời khác. Đọc bình luận về câu trả lời khác tại sao điều này không được khuyến khích.
BalusC

8
Từ Java 7 chúng ta có thể sử dụng String[] GPXFILES1 = myset.toArray(new String[0])và đó là khuyến nghị. Cập nhật câu trả lời. "Vì các bản cập nhật muộn của OpenJDK 6, cuộc gọi này đã được thực hiện, làm cho hiệu suất của phiên bản mảng trống giống nhau và đôi khi còn tốt hơn so với phiên bản có kích thước trước. một cuộc đua dữ liệu có thể xảy ra giữa cuộc gọi kích thước và cuộc gọi toArray có thể dẫn đến thêm null ở cuối mảng, nếu bộ sưu tập bị thu hẹp đồng thời trong quá trình hoạt động. " - trích dẫn bởi cộng đồng java.
Chaitanya

6
Gặp câu trả lời này trước và sau đó thực hiện nhiều nghiên cứu hơn, có một số bằng chứng để hỗ trợ cho nhận xét trên là chính xác; và câu trả lời được chấp nhận là hết hạn. Lấy các liên kết ví dụ này cho những gì bạn sẽ: stackoverflow.com/questions/9863742/ , và một liên kết từ bài đăng SO đó shipilev.net/blog/2016/arrays-wisdom-ancents .
RMSD

60

Java 11

toArrayPhương thức mặc định mới trong Collectiongiao diện cho phép các phần tử của bộ sưu tập được chuyển đến một mảng mới được tạo của kiểu thời gian chạy mong muốn. mất IntFunction<T[]> generatornhư là đối số và có thể được sử dụng như:

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

Đã có một phương pháp tương tự Collection.toArray(T[])và bổ sung này có nghĩa là chúng tôi không còn có thể vượt quanull thành đối số vì trong trường hợp đó, tham chiếu đến phương thức sẽ không rõ ràng. Nhưng vẫn ổn vì cả hai phương pháp đều ném NPE.

Java 8

Trong Java 8, chúng ta có thể sử dụng API luồng:

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

Chúng tôi cũng có thể sử dụng phiên bản quá tải của toArray ()IntFunction<A[]> generatordạng:

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

Mục đích của hàm tạo ở đây là lấy một số nguyên (kích thước của mảng mong muốn) và tạo ra một mảng có kích thước mong muốn. Cá nhân tôi thích cách tiếp cận trước đây bằng cách sử dụng tham chiếu phương thức hơn phương pháp sau sử dụng biểu thức lambda.


bạn không cần stream()sử dụng toArray(). Nó có thể làset.toArray(new String[0])
Jakub Pomykała

1
@ JakubPomykała Điều đó thực sự không tốt. Khi bạn đưa ra một mảng có kích thước sai, bên trong hàm đó phải sử dụng sự phản chiếu để có được một mảng có kích thước chính xác. Nếu phương pháp này là cần thiết, chỉ cần thực hiệnset.toArray(new String[set.size()]);
Debosmit Ray

42

Sử dụng phương thức toArray (T [] a) :

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

26
Khi bạn truyền cho toArray () một mảng có kích thước quá nhỏ, phương thức toArray () phải xây dựng một mảng mới có kích thước phù hợp bằng cách sử dụng sự phản chiếu. Điều này có hiệu suất kém hơn đáng kể so với việc chuyển vào một mảng ít nhất là kích thước của chính bộ sưu tập. Do đó [0]nên được thay thế bằng [myset.size()]như trong câu trả lời được chấp nhận.
k2col

10
@ k2col có vẻ như bây giờ set.toArray(new String[0])có độ hoàn hảo tốt hơnset.toArray(new String[set.size()]
Xam

1
Vì Java 7, đây là cách tiếp cận ưa thích. Xem bình luận này .
acdcjunior



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

0

Tôi đã phải đối mặt với tình huống tương tự.

Tôi bắt đầu bằng cách khai báo các cấu trúc tôi cần:

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

Trong trường hợp của tôi, tôi có một đối tượng JSON và tôi cần tất cả các khóa trong JSON này được lưu trữ trong một chuỗi các chuỗi. Sử dụng thư viện GSON , tôi sử dụng JSON.keySet () để lấy các khóa và di chuyển đến Bộ của tôi:

myKeysInSet = json_any.keySet();

Với điều này, tôi có một cấu trúc Set với tất cả các phím, khi tôi cần nó. Vì vậy, tôi chỉ cần các giá trị cho Mảng Chuỗi của tôi. Xem mã dưới đây:

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

Đây là câu trả lời đầu tiên của tôi trong StackOverflow. Xin lỗi vì bất kỳ lỗi nào: D

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.