জাভা: লুপ ইআর জন্য একাধিক ভেরিয়েবল সূচনা?


92

আমি বিভিন্ন ধরণের দুটি লুপ ভেরিয়েবল রাখতে চাই। এই কাজ করার কোন উপায় আছে?

@Override
public T get(int index) throws IndexOutOfBoundsException {
    // syntax error on first 'int'
    for (Node<T> current = first, int currentIndex; current != null; 
            current = current.next, currentIndex++) {
        if (currentIndex == index) {
            return current.datum;
        }
    }
    throw new IndexOutOfBoundsException();
}

কী first? এটি কোথাও ঘোষিত হয়নি। এটি কি কোনও শ্রেণির সদস্য?
এক্সারেনন

7
আপনার নীচের একটি উত্তর গ্রহণ করা উচিত
Mr_and_Mrs_D

এবং সি এর বিপরীতে, জাভাতে কমা অপারেটর নেই: স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 12601596/… , যা বিভিন্ন ধরণের দুটি ভেরিয়েবল আরম্ভ করার অনুমতি দেয় (তবে ঘোষণা দেয় না)।
সিরো সান্তিলি :5 冠状 病 六四 事件

@ নিক হেইনার আপনি কি দয়া করে নীচের উত্তরগুলির কোনওটিকে গৃহীত হিসাবে চিহ্নিত করতে পারেন?
জেমস Monger

উত্তর:


105

একটি আরম্ভেরfor বিবৃতি জন্য নিয়ম অনুসরণ করে স্থানীয় পরিবর্তনশীল ঘোষণা

এটি আইনী হবে (মূর্খ হলে):

for (int a = 0, b[] = { 1 }, c[][] = { { 1 }, { 2 } }; a < 10; a++) {
  // something
}

তবে পৃথক Nodeএবং intপ্রকারগুলি যেমনটি আপনি চান তেমন ঘোষণার চেষ্টা করা স্থানীয় চলক ঘোষণার জন্য আইনী নয়।

আপনি এই জাতীয় ব্লক ব্যবহার করে পদ্ধতিগুলির মধ্যে অতিরিক্ত ভেরিয়েবলের সুযোগ সীমাবদ্ধ করতে পারেন:

{
  int n = 0;
  for (Object o = new Object();/* expr */;/* expr */) {
    // do something
  }
}

এটি নিশ্চিত করে যে আপনি ভুলক্রমে পদ্ধতিতে অন্য কোনও স্থানে পুনরায় ব্যবহার করবেন না।


10
ভাষা ডিজাইনাররা এই আপাতদৃষ্টিতে অপ্রয়োজনীয় সীমাবদ্ধতা প্রয়োগ করলেন কেন কারও ধারণা আছে?
জেফ অ্যাক্সেলরড

@glenviewjeff - এটিকে আলাদা প্রশ্ন হিসাবে সেরা জিজ্ঞাসা করা হবে।
ম্যাকডোয়েল 21

4
@JeffAxelrod, ঐতিহাসিক কারণে হয়তো কারণ জাভা সি অনুকরণে ছিল ++, ... পোস্টটি দেখুন: stackoverflow.com/questions/2687392/...
ক্রিস্টোফ Roussy

4
ব্লক ব্যবহারের জন্য +1, আমি এগুলিকে প্রচুর ব্যবহার করি, নিরীহ ভুল করার চেয়ে এখনও ভাল
ক্রিস্টোফ রাউসি

18

আপনি এটি পছন্দ করতে পারেন না। হয় আপনি একই ধরণের একাধিক ভেরিয়েবল ব্যবহার করেন for(Object var1 = null, var2 = null; ...)বা অন্য ভেরিয়েবলটি বের করে লুপের আগে ঘোষণা করেন।


9

কেবলমাত্র ভেরিয়েবল ডিক্লেয়ারেশন ( Node<T> current, int currentIndex) লুপের বাইরে নিয়ে যান এবং এটি কাজ করা উচিত। এটার মতো কিছু

int currentIndex;
Node<T> current;
for (current = first; current != null; current = current.next, currentIndex++) {

অথবা এমনকি এমনকি

int currentIndex;
for (Node<T> current = first; current != null; current = current.next, currentIndex++) {

4
উভয়ই সংকলন করবে না: ব্যবহারের আগে আপনাকে ভেরিয়েবল শুরু করতে হবে।
আনবেলি

@ উনবেলি ভাল, আমি ম্যানুয়াল কোড সংকলনে ব্যায়াম করছিলাম না :) আমি কেবল এই ধারণাটি দিতে চাই।
নিকিতা রাইবাক

4
@ উনবেলি: কেবল স্পষ্ট করে বলার জন্য: কারেন্ট ইন্ডেক্স সূচনা করা দরকার। নিকিতা এটির সাথে প্রথম কাজটি হ'ল "কারেন্টইন্ডেক্স ++", যা স্বাভাবিকভাবেই প্রশ্ন উত্থাপন করে, বৃদ্ধি কী? কারেন্টটি ঠিক আছে কারণ প্রথম ব্যবহারটি এটি প্রথমে সেট করা হয়।
জয়

সাধারণত একটি লুপের জন্য একটি ইনক্রিমেন্টেশন লেখার পক্ষে আরও ভালভাবে লেখার জন্য ++ var ব্যবহার করা উচিত সংকলক থেকে বর্ণের বার্তাটি ডুপ্লিকেট করার পূর্বে বর্ণের ফলাফল হিসাবে এটি ফেরত দেওয়ার জন্য সংকলক থেকে প্রয়োজনীয় ++ var ব্যবহার করা উচিত যদিও কেউ কখনও এটি চায় না। অবশ্যই, সংকলক এটি অপ্টিমাইজ করবে তবে এটি অন্যদের পরিষ্কার-পরিচ্ছন্ন হওয়ার অপেক্ষায় রাস্তায় ট্র্যাশ ফেলে দেওয়ার মতো।
চকি

5

প্রারম্ভিককরণ ব্লকে ঘোষিত চলকগুলি অবশ্যই একই ধরণের হতে হবে

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

for(int i=0, b=0, c=0, d=0....;/*condition to be applied */;/*increment or other logic*/){
      //Your Code goes here
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.