কিভাবে জাভায় স্ট্রিং অ্যারেতে অবজেক্ট অ্যারে রূপান্তর করবেন


244

আমি অবজেক্ট অ্যারেটিকে স্ট্রিং অ্যারে রূপান্তর করতে নিম্নলিখিত কোডটি ব্যবহার করি:

Object Object_Array[]=new Object[100];
// ... get values in the Object_Array

String String_Array[]=new String[Object_Array.length];

for (int i=0;i<String_Array.length;i++) String_Array[i]=Object_Array[i].toString();

তবে আমি ভাবছি যে এটি করার অন্য কোনও উপায় আছে কিনা:

String_Array=(String[])Object_Array;

তবে এটি রানটাইম ত্রুটির কারণ হতে পারে: Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;

এটি করার সঠিক উপায় কী?


3
আমি ওয়াক্সউইংয়ের উত্তরটি সর্বোত্তম পছন্দ করি: স্ট্রিং [] স্ট্রিংআরাই = অ্যারেসকপিওফ (অবজেক্টআরাই, অবজেক্টআরএই লেন্থ, স্ট্রিং []। বর্গ); এটি খুব সংক্ষিপ্ত এবং কাজ করে। আমি উত্তর দিয়েছি এবং তার উত্তর এবং আমার বর্তমান পদ্ধতির উভয়ের জন্য এটি কত সময় নেয়, সেগুলি বেশ একই রকম।
ফ্রাঙ্ক

উত্তর:


381

এর অন্য বিকল্প System.arraycopy:

String[] stringArray = Arrays.copyOf(objectArray, objectArray.length, String[].class);

59
শুধুমাত্র জাভা 1.6 এবং তার উপরে
নিউঅ্যাক্যাক্ট

10
এইচআরএম। আমি এটির কাজ করতে পারি না, যেখানে মূল প্রশ্নের দীর্ঘ-রূপের উদাহরণটি কাজ করে। এটি java.lang.ArrayStoreException নিক্ষেপ করে। আমি আমার কাস্টম টাইপযুক্ত জেনেরিক অ্যারেলিস্টে টু অ্যারে পদ্ধতি থেকে অবজেক্ট অ্যারে পাচ্ছি। এটি জেনেরিকস বা কোনও কিছুর সাথে কাজ করবে বলে আশা করা যায় না?
ইয়ান ভারালি

4
@ ইয়ান, বিষয়টি হ'ল অবজেক্টআর্রে স্ট্রিংস নন অবজেক্টস রয়েছে (এমাইয়ার্স আমার উত্তরটিতে মন্তব্য করেছেন যা একই সমস্যায় ভুগছে)।
যিশাই

3
আমি কেবল এই পদ্ধতির চেষ্টা করেছি এবং, কমপক্ষে আমার ক্ষেত্রে, আমি জানতে পেরেছি যে পুনরাবৃত্তি করে নিজেই অ্যারে তৈরি করার মতো পারফরম্যান্সটি তেমন ভাল নয়। (খুব খারাপ হলেও, আমি এটি ওয়ান-লাইনার হিসাবে পছন্দ করেছি!)
এমডুপ

1
@ এমডুপ - বেশ লম্বা এক লাইনার সম্ভবত একটি পদ্ধতিতে এটি মোড়ানো।
মাস্টারজয়ে

72

জাভা 8 তে:

String[] strings = Arrays.stream(objects).toArray(String[]::new);

অন্যান্য ধরণের অ্যারে রূপান্তর করতে:

String[] strings = Arrays.stream(obj).map(Object::toString).
                   toArray(String[]::new);

2
এটি সৌন্দর্যের কাজ এবং নন-স্ট্রিং অবজেক্ট অ্যারেটিকে তাদের স্ট্রিং সমতুল্য অ্যারে রূপান্তর করতে সক্ষম হওয়ার প্রয়োজনীয়তাটি পূরণ করে। বর্তমানে গৃহীত উত্তর এটি পূরণ করে না।
b4n4n4p4nd4

এটি কাজ করে তবে আপনার তালিকায় যদি নাল থাকে তবে আপনি একটি নালপয়েন্টার এক্সসেপশন পাবেন। এই সমস্যাটি ঘুরে দেখার জন্য দেখুন: stackoverflow.com/questions/4581407/…
টনি ফাবেলা

61

System.arraycopy সম্ভবত সবচেয়ে দক্ষ উপায়, তবে নান্দনিকতার জন্য, আমি পছন্দ করি:

 Arrays.asList(Object_Array).toArray(new String[Object_Array.length]);

10
এটি কেবল তখনই কাজ করে যদি বস্তুগুলি সমস্ত স্ট্রিং হয়; তার বর্তমান কোড না থাকলেও সেগুলি কাজ করে।
মাইকেল ময়র্স

ভাল যুক্তি. আমি ট্যাস্ট্রিংকে কেবল স্ট্রিংয়ে কাস্ট করার এক উপায় হিসাবে বুঝতে পেরেছিলাম, বস্তুগুলিকে আসলে অন্য কিছু দিয়ে প্রতিস্থাপনের অভিপ্রায় নয়। যদি আপনার এটি করা দরকার তবে লুপিংয়ের একমাত্র উপায়।
যিশাই

এটি অ্যান্ড্রয়েড ২.৩.৩ এ কাজ করে না .. এটি আমাকে একটি ত্রুটি দেয় যা কপিওফ পদ্ধতিটি সংজ্ঞায়িত নয়। আমি সমস্ত ডান ফাইল (ctrl + shift + I) আমদানি করেছি .. তবে এটি এখনও কার্যকর হয় না।
ব্যবহারকারী590849

3
@ user590849, আমার উত্তর ব্যবহার করে না copyof। আপনি অন্য উত্তর রেফারেশন করছেন?
ইশাই

50

আমি দেখতে পাচ্ছি যে কিছু সমাধান সরবরাহ করা হয়েছে তবে কোনও কারণ নয় তাই আমি এটিকে বিস্তারিতভাবে ব্যাখ্যা করব কারণ আমার বিশ্বাস যে আপনি কী ভুল করছেন তা জানা গুরুত্বপূর্ণ যে কেবলমাত্র দেওয়া উত্তরগুলি থেকে "কিছু" পেতে পারে।

প্রথমে দেখা যাক ওরাকল কী বলছেন

 * <p>The returned array will be "safe" in that no references to it are
 * maintained by this list.  (In other words, this method must
 * allocate a new array even if this list is backed by an array).
 * The caller is thus free to modify the returned array.

এটি গুরুত্বপূর্ণ নাও লাগতে পারে তবে আপনি এটি দেখতে পাবেন ... সুতরাং নিম্নলিখিত রেখাটি কী ব্যর্থ হয়? তালিকার সমস্ত বস্তু স্ট্রিং কিন্তু এটি তাদের রূপান্তর করে না, কেন?

List<String> tList = new ArrayList<String>();
tList.add("4");
tList.add("5");
String tArray[] = (String[]) tList.toArray();   

সম্ভবত, আপনারা অনেকেই ভাবেন যে এই কোডটি একই করছে, তবে তা হয় না।

Object tSObjectArray[] = new String[2];
String tStringArray[] = (String[]) tSObjectArray;

বাস্তবে যখন লিখিত কোডটি এরকম কিছু করছে। জাভডোক বলছে তো! এটি একটি নতুন অ্যারে তাত্ক্ষণিকভাবে প্রেরণ করবে, এটি অবজেক্টগুলির কী হবে !!!

Object tSObjectArray[] = new Object[2];
String tStringArray[] = (String[]) tSObjectArray;   

সুতরাং tList.toArray স্ট্রিং নয় বরং একটি অবজেক্ট ইনস্ট্যান্ট করছে ...

অতএব, প্রাকৃতিক সমাধান যা এই থ্রেডে উল্লেখ করা হয়নি, তবে এটি ওরাকল যা নিম্নলিখিতটি প্রস্তাবিত তা হল

String tArray[] = tList.toArray(new String[0]);

আশা করি এটি যথেষ্ট পরিষ্কার।


হালকা সংশোধন কর্মক্ষমতা অনুযায়ী: স্ট্রিং tArray [] = tList.toArray (নতুন স্ট্রিং [tList.size ()]); অন্যথায় অ্যারেটিকে আবার আকার দিতে হবে ...
লোনজাক

1
ভাল ব্যাখ্যা। আরও একটি জিনিস, যদি মেমরির খরচ বা পারফরম্যান্স কোনও সমস্যা হয় তবে অ্যারেরটিকে নকল করবেন না। উভয় ক্ষেত্রেই স্ট্রিং একটি উপাদান নিক্ষেপ যখনই আপনি এটি প্রয়োজন (String)Object_Array[i]বা Object_Array[i].toString()বা একটি স্ট্রিং অ্যারে হিসাবে অ্যারে বরাদ্দ Object Object_Array[]=new String[100];... মান পেতে ... তারপর নিক্ষেপ String_Array=(String[])Object_Arrayযা এখন কাজ করে।
সোলোস্টারান 14

1
এটি অ্যারেস্টোরএক্সেপশন ছুড়ে ফেলেছে
ইলতাফ খালিদ

7

গুগল কালেকশন ফ্রেমওয়ার্কটি একটি ভাল ট্রান্সফর্ম পদ্ধতির উদ্ধৃতি সরবরাহ করে, যাতে আপনি আপনার অবজেক্টগুলিকে স্ট্রিংয়ে রূপান্তর করতে পারেন। একমাত্র খারাপ দিক এটি হ'ল এটি Iteable থেকে Iteable হতে হবে তবে আমি এটি এইভাবেই করব:

Iterable<Object> objects = ....... //Your chosen iterable here
Iterable<String> strings = com.google.common.collect.Iterables.transform(objects, new Function<Object, String>(){
        String apply(Object from){
             return from.toString();
        }
 });

এটি আপনাকে অ্যারে ব্যবহার থেকে দূরে সরিয়ে নিয়ে যায় তবে আমি মনে করি এটি আমার পছন্দসই উপায়।


1
@ যিশাই: না, অ্যারেগুলি ইটেবল কার্যকর হয় না। তাদের উপর পুনরাবৃত্তিটি জেএলএস
নতুনভাবে

@ নতুনাক্যাক্ট, একদম সত্য, আমি বোঝাতে চাইছিলাম অ্যারে সহজেই একটি আইটেবল (অ্যারেজ.এললিস্ট ()) এ মুড়ে ফেলা যায়। কেন জানি না কেন সেভাবে বেরিয়ে এসেছিল।
ইশাই

5

আপনি যদি আপনার অ্যারেতে থাকা সামগ্রীর স্ট্রিং প্রতিনিধিত্ব পেতে চান তবে হ্যাঁ, এটি করার কোনও উপায় নেই।

যদি আপনি জানেন যে আপনার অবজেক্ট অ্যারেতে কেবল স্ট্রিংস রয়েছে তবে আপনি এটিও করতে পারেন (টু স্ট্রিংকে কল করার ইনস্ট্রেড ()):

for (int i=0;i<String_Array.length;i++) String_Array[i]= (String) Object_Array[i];

কেবলমাত্র যখন আপনি অবজেক্ট_আরয়ের স্ট্রিং [] এ কাস্ট ব্যবহার করতে পারতেন কেবল তখনই এটির রেফারেন্সগুলি অ্যারেং হিসাবে সংজ্ঞায়িত করা যেতে পারে [] যেমন এটি কাজ করবে:

    Object[] o = new String[10];
    String[] s = (String[]) o;

5

এইটি দুর্দান্ত, তবে বর্গাকার বন্ধনীগুলির কারণে মাইমাররা লক্ষ্য করে যেমন কাজ করে না:

Arrays.toString(objectArray).split(",")

এটি কুৎসিত তবে কাজ করে:

Arrays.toString(objectArray).replaceFirst("^\\[", "").replaceFirst("\\]$", "").split(",")

আপনি যদি এই কোডটি ব্যবহার করেন তবে আপনাকে অবশ্যই নিশ্চিত হতে হবে যে আপনার অবজেক্টের টুস্ট্রিং () দ্বারা ফিরে আসা স্ট্রিংগুলিতে কমা নেই।


1
আকর্ষণীয় পরামর্শ, তবে আপনাকে প্রথমে প্রথম এবং শেষ উপাদানগুলিতে [এবং] সরিয়ে ফেলতে হবে।
মাইকেল মায়ার্স

1
এটি কাজ সম্পাদন না করা অবধি চমত্কার :)
এজেড_

2
কোনও স্ট্রিংয়ে কমা (,) থাকলে
আন্দ্রেয়াস বার্গার

2

আপনার ধারণার জন্য, আসলে আপনি সাফল্যের দিকে এগিয়ে যাচ্ছেন, তবে আপনি যদি এটি করেন তবে ভাল হওয়া উচিত:

for (int i=0;i<String_Array.length;i++) String_Array[i]=(String)Object_Array[i];

বিটিডাব্লু, অ্যারে ইউটিলিটি পদ্ধতিটি ব্যবহার করা বেশ ভাল এবং কোডটি মার্জিত করে তোলে।



1

আপনি টাইপ-রূপান্তরকারী ব্যবহার করতে পারেন । যে কোনও ধরণের অ্যারেগুলিকে স্ট্রিংয়ের অ্যারে রূপান্তর করতে আপনি নিজের কনভার্টারটি নিবন্ধন করতে পারেন:

 TypeConverter.registerConverter(Object[].class, String[].class, new Converter<Object[], String[]>() {

        @Override
        public String[] convert(Object[] source) {
            String[] strings = new String[source.length];
            for(int i = 0; i < source.length ; i++) {
                strings[i] = source[i].toString();
            }
            return strings;
        }
    });

এবং এটি ব্যবহার করুন

   Object[] objects = new Object[] {1, 23.43, true, "text", 'c'};
   String[] strings = TypeConverter.convert(objects, String[].class);

0

কোনও মাথাব্যথা ছাড়াই সহজেই পরিবর্তন করুন যে কোনও বস্তুর অ্যারেটিকে স্ট্রিং অ্যারে অবজেক্ট ড্রাইভএক্সে রূপান্তর করুন [] = {1,2};

    for(int i=0; i<drive.length ; i++)
        {
            Str[i]= drivex[i].toString();
            System.out.println(Str[i]); 
        }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.