জাভাতে গতিশীল নামের সাথে ভেরিয়েবল বরাদ্দ করা


96

আমি জাভাতে ভেরিয়েবলগুলির একটি সেট নীচে নির্ধারণ করতে চাই:

int n1,n2,n3;

for(int i=1;i<4;i++)
{
    n<i> = 5;
}

আমি জাভাতে এটি কীভাবে অর্জন করতে পারি?


4
আপনি দয়া করে আপনার প্রশ্ন পরিষ্কার করতে পারেন?
ইঞ্জি ফুয়েড

4
স্থানীয় ভেরিয়েবলের জন্য আপনার এটি করা দরকার? অ্যারের উপাদানগুলি কেন নয়?
রায় তোয়াল

@ ইঞ্জি। ফুয়াদ: আমি পরিবর্তনশীল তাদের নাম দিয়ে গতিশীল অ্যাক্সেস করতে চাই।
আশীষ আনন্দ

@Ashish আনন্দ আপনি নামের অর্থ হয় stackoverflow.com/questions/6629995/...
mKorbel

উত্তর:


111

আপনি জাভাতে এই জিনিসগুলি করেন না। জাভাতে কোনও গতিশীল পরিবর্তনশীল নেই। জাভা ভেরিয়েবলগুলি উত্স কোড 1 এ ঘোষণা করতে হবে ।

আপনি কী অর্জন করতে চাইছেন তার উপর নির্ভর করে আপনার একটি অ্যারে, এ Listবা এ ব্যবহার করা উচিত Map; যেমন

int n[] = new int[3];
for (int i = 0; i < 3; i++) {
    n[i] = 5;
}

List<Integer> n = new ArrayList<Integer>();
for (int i = 1; i < 4; i++) {
    n.add(5);
}

Map<String, Integer> n = new HashMap<String, Integer>();
for (int i = 1; i < 4; i++) {
    n.put("n" + i, 5);
}

সোর্স কোডে ঘোষিত ভেরিয়েবলগুলিকে গতিশীলভাবে উল্লেখ করতে প্রতিবিম্বটি ব্যবহার করা সম্ভব । যাইহোক, এটি কেবল শ্রেণীর সদস্যদের (যেমন স্থির এবং উদাহরণ ক্ষেত্র) ভেরিয়েবলগুলির জন্য কাজ করে। এটি স্থানীয় ভেরিয়েবলের জন্য কাজ করে না। @ ফায়ারের "দ্রুত এবং নোংরা" উদাহরণ দেখুন।

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


1 - এই বিবৃতিটি কিছুটা ভুল। আপনি যদি বিসিইএল বা এএসএম ব্যবহার করেন তবে আপনি বাইটকোড ফাইলটিতে ভেরিয়েবলগুলি "ডিক্লেয়ার" করতে পারেন। তবে এটা করবেন না! এইভাবে মিথ্যা পাগলামি!


4
অনেক অনেক ধন্যবাদ, আমি যা খুঁজছিলাম তা পেয়েছি got শেষ অংশ (মানচিত্র <স্ট্রিং, পূর্ণসংখ্যা>)
আশীষ আনন্দ

4
এটি লক্ষ করা উচিত যে এটি সম্ভব হলেও, এটি এমন কিছু হওয়া উচিত নয় যা আপনি আসলে করবেন। আপনি এটি থেকে কিছুই লাভ করবেন না; আপনি আসলে পঠনযোগ্যতা হারাবেন। আপনি যদি তাদের লিঙ্ক করতে চান তবে এর Map<String, T>পরিবর্তে একটি ব্যবহার করুন, আপনার আসল কোডটি দিয়ে গন্ডগোল শুরু করবেন না।
জেরোইন ভেনেভিল

4
@ জিরোয়ানভানভেল - "পাগলামি" বলতে আমি এটাই বুঝি :-)
স্টিফেন সি

35

আপনি যদি ভেরিয়েবলগুলি অ্যাক্সেস করতে চান তবে কিছু প্রকার গতিশীল আপনি প্রতিবিম্ব ব্যবহার করতে পারেন। তবে প্রতিবিম্ব স্থানীয় ভেরিয়েবলের জন্য কাজ করে না। এটি কেবল শ্রেণি বৈশিষ্ট্যের জন্য প্রযোজ্য।

একটি মোটামুটি দ্রুত এবং নোংরা উদাহরণ এটি:

public class T {
    public Integer n1;
    public Integer n2;
    public Integer n3;

    public void accessAttributes() throws IllegalArgumentException, SecurityException, IllegalAccessException,
            NoSuchFieldException {

        for (int i = 1; i < 4; i++) {
            T.class.getField("n" + i).set(this, 5);
        }
    }
}

আপনাকে এই কোডটি বিভিন্ন উপায়ে উন্নত করতে হবে এটি কেবল উদাহরণ। এটিও ভাল কোড হিসাবে বিবেচিত হয় না।


4
দুর্দান্ত যখন আপনার অ্যান্ড্রয়েডের সেন্সর ইভেন্ট.ভ্যালুগুলি [] কে ভেরিয়েবলের একটি সেটে রূপান্তর করতে হবে। ইভেন্ট.ভ্যালুগুলি [] এর দৈর্ঘ্য 1 থেকে 6 হতে পারে এবং এটি অ্যারে-কম জেসন মার্শালিংয়ের ক্ষেত্রে এটি রূপান্তরিত করা সহজ।
ফারশিদ টি

12

আপনার যা প্রয়োজন তা অ্যারে নামকরণ করা হয়েছে। আমি নিম্নলিখিত কোডটি লিখতে চেয়েছিলাম:

int[] n = new int[4];

for(int i=1;i<4;i++)
{
    n[i] = 5;
}

4
অ্যারে ব্যবহার করতে চাই না। আমি কিছু শর্তের উপর নির্ভর করে পরিবর্তনশীল (এন 1, এন 2, এন 3) অ্যাক্সেস করতে চাই।
আশীষ আনন্দ

10

আপনার ব্যবহার করা উচিত Listবা arrayপরিবর্তে

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);

বা

int[] arr  = new int[10];
arr[0]=1;
arr[1]=2;

বা আরও ভাল

Map<String, Integer> map = new HashMap<String, Integer>();
map.put("n1", 1);
map.put("n2", 2);

//conditionally get 
map.get("n1");

7

জাভাতে গতিশীল পরিবর্তনশীল নামগুলি
এরকম কোনও জিনিস নেই।

আপনার ক্ষেত্রে আপনি অ্যারে ব্যবহার করতে পারেন:

int[] n = new int[3];
for() {
 n[i] = 5;
}

আরও সাধারণ (name, value)জোড়া জন্য, ব্যবহার করুনMap<>


4

এইভাবে চেষ্টা করুন:

    HashMap<String, Integer> hashMap = new HashMap();

    for (int i=1; i<=3; i++) {
        hashMap.put("n" + i, 5);
    }

4

আপনি না। আপনি যে নিকটতম জিনিসটি করতে পারেন তা হ'ল মানচিত্রের সাথে অনুকরণ করার জন্য কাজ করা বা এটি মোকাবেলা করার জন্য আপনার নিজের অবজেক্টকে সংজ্ঞায়িত করা।

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