সেট <স্ট্রিং> কে স্ট্রিং [] এ রূপান্তর করবেন কীভাবে?


281

আমার একটি String[]থেকে বেরিয়ে আসা দরকার Set<String>তবে এটি কীভাবে করা যায় তা আমি জানি না। নিম্নলিখিত ব্যর্থ:

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

আমি এটি কীভাবে এটি ঠিক করতে পারি যাতে এটি কার্যকর হয়?


5
toArray()জাভাডোকে স্পষ্টভাবে উল্লেখ করা পদ্ধতিটির সাথে ।
লার্নের মারকুইস

1
জাভা 8 সমাধান: stackoverflow.com/questions/5982447/...
akhil_mittal

জাভা 11: নতুন toArray()ডিফল্ট পদ্ধতি
স্ট্যাকওভারফ্লো.com

উত্তর:


461

Set#toArray(T[])একই আকারের টাইপ করা অ্যারে আর্গুমেন্ট গ্রহণ পদ্ধতিটি ব্যবহার করুন ।

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

একটি ভিন্ন আকারও ব্যবহার করা যেতে পারে, তবে toArray()এটি প্রদত্ত যুক্তি পুনরায় ব্যবহারের পরিবর্তে পদ্ধতিটিকে নতুন অ্যারে তৈরি করতে বাধ্য করবে , যা কম দক্ষ হতে পারে।

এর উত্স কোডওAbstractCollection#toArray() দেখুন ।


5
আপনি 0 মাপের String[] GPXFILES1 = myset.toArray(new String[0]);
অ্যারেও

1
@ স্যাকটিউ: এটি ইতিমধ্যে অন্যান্য উত্তর দ্বারা আবৃত। এটি কেন সুপারিশ করা হয় না তা অন্য উত্তরে মন্তব্য পড়ুন।
বালুসসি

8
জাভা 7 থেকে আমরা ব্যবহার করতে পারি String[] GPXFILES1 = myset.toArray(new String[0])এবং এটি প্রস্তাবিত। উত্তর আপডেট করুন। "ওপেনজেডকে of এর দেরি আপডেট হওয়ার পরে, পূর্ব-আকারের সংস্করণটির তুলনায় খালি অ্যারের সংস্করণটির কার্যকারিতা একই এবং কখনও কখনও আরও ভাল হয়ে ওঠে এই কলটি সূচিত হয়েছিল Also এছাড়াও প্রাক-আকারের অ্যারে পাস করা একসাথে বা সিঙ্ক্রোনাইজড সংগ্রহ হিসাবে বিপজ্জনক অপারেশনের সময় যদি সংগ্রহটি একই সাথে সঙ্কুচিত হয়ে থাকে তবে আকার এবং টু অ্যারে কলের মধ্যে একটি ডেটা রেস সম্ভব হয় যার ফলে অ্যারের শেষে অতিরিক্ত শূন্য হতে পারে। " - জাভা সম্প্রদায় দ্বারা উদ্ধৃত।
চৈতন্য

6
প্রথমে এই উত্তরটি মোকাবিলা করুন এবং তারপরে আরও গবেষণা করুন, উপরোক্ত মন্তব্যটি সঠিক বলে সমর্থন করার মতো কিছু প্রমাণ রয়েছে; এবং গৃহীত উত্তর পুরানো। কি আপনি হবে জন্য এই উদাহরণ লিঙ্ক নিন stackoverflow.com/questions/9863742/... , এবং যাতে পদ থেকে একটি লিঙ্ক shipilev.net/blog/2016/arrays-wisdom-ancients
আরএমএসডি

60

জাভা 11

ইন্টারফেসে নতুন ডিফল্ট toArrayপদ্ধতি Collectionসংগ্রহের উপাদানগুলিকে পছন্দসই রানটাইম টাইপের নতুন নির্মিত অ্যারেতে স্থানান্তরিত করতে দেয়। এটিIntFunction<T[]> generator আর্গুমেন্ট হিসাবে গ্রহণ করে এবং এটি ব্যবহার করা যেতে পারে:

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

ইতিমধ্যে একটি অনুরূপ পদ্ধতি রয়েছে Collection.toArray(T[])এবং এর সংযোজনটির অর্থ আমরা আর nullযুক্তি হিসাবে পাস করতে পারব না কারণ সেই ক্ষেত্রে পদ্ধতির উল্লেখটি অস্পষ্ট হবে। তবে এটি এখনও ঠিক আছে যেহেতু উভয় পদ্ধতিই কোনও এনপিই ফেলে দেয়।

জাভা 8

জাভা 8-তে আমরা স্ট্রিম এপিআই ব্যবহার করতে পারি:

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

আমরা ট্যারে () এর ওভারলোড হওয়া সংস্করণটিও ব্যবহার করতে পারি যা গ্রহণ IntFunction<A[]> generatorকরে:

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

এখানে জেনারেটর ফাংশনটির উদ্দেশ্য হ'ল একটি পূর্ণসংখ্যা (পছন্দসই অ্যারের আকার) নেওয়া এবং পছন্দসই আকারের একটি অ্যারে উত্পাদন করা। ল্যাম্বডা এক্সপ্রেশন ব্যবহারের পরে পদ্ধতির চেয়ে আমি ব্যক্তিগতভাবে পদ্ধতির রেফারেন্স ব্যবহার করে পছন্দ করি।


আপনার stream()ব্যবহারের দরকার নেই toArray()। এটি হতে পারেset.toArray(new String[0])
Jakub Pomykała

1
@ জাকুবপোমাইকাłা আসলে এটি ভাল নয়। আপনি যখন ভুল আকারের একটি অ্যারে দেন, অভ্যন্তরীণভাবে সেই ফাংশনটিতে একটি অ্যারের সঠিক আকার পেতে প্রতিবিম্বটি ব্যবহার করতে হয়। যদি এই পদ্ধতির প্রয়োজন হয়, তবে কেবল করুনset.toArray(new String[set.size()]);
3

42

ব্যবহারের toArray (টি [] ক) পদ্ধতি:

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

26
আপনি অ্যারিতে () খুব ছোট আকারের একটি অ্যারে পাস করার পরে, টো অ্যারে () পদ্ধতিতে প্রতিবিম্বটি ব্যবহার করে সঠিক আকারের একটি নতুন অ্যারে তৈরি করতে হবে। এটি সংগ্রহের কমপক্ষে আকারের অ্যারেতে যাওয়ার চেয়ে উল্লেখযোগ্যভাবে খারাপ পারফরম্যান্স পেয়েছে। অতএব[0][myset.size()] গৃহীত উত্তরের মতো প্রতিস্থাপন করা উচিত ।
2col

10
@ কে 2col দেখে মনে হচ্ছে এখনকার set.toArray(new String[0])চেয়ে ভাল পারফরম্যান্স রয়েছেset.toArray(new String[set.size()]
Xam

1
জাভা 7 যেহেতু এটি পছন্দসই পদ্ধতি। এই মন্তব্য দেখুন ।
acdcjunior


2

জাভা 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/ Collections.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 এর সমস্ত কীগুলি স্ট্রিংগুলির অ্যারেতে সঞ্চয় করতে হবে। জিএসওএন লাইব্রেরি ব্যবহার করে , আমি কীগুলি পেতে এবং আমার সেটে সরানোর জন্য JSON.keySet () ব্যবহার করি:

myKeysInSet = json_any.keySet();

এটির সাথে, আমার সমস্ত কীগুলির সাথে একটি সেট কাঠামো রয়েছে, যেমনটি আমার প্রয়োজন ছিল। সুতরাং আমার স্ট্রিংগুলির অ্যারের মানগুলি দরকার। নীচের কোডটি দেখুন:

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

এটি স্ট্যাকওভারফ্লোতে আমার প্রথম উত্তর ছিল। কোনও ত্রুটির জন্য দুঃখিত: ডি

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.