जावा: लूप इनिट के लिए कई वेरिएबल्स की शुरुआत करें?


91

मैं अलग-अलग प्रकार के दो लूप वैरिएबल रखना चाहता हूं। क्या यह काम करने का कोई तरीका है?

@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

और सी के विपरीत, जावा में अल्पविराम ऑपरेटर नहीं है: stackoverflow.com/questions/12601596/… , जो विभिन्न प्रकारों के दो चर को आरंभ (घोषित नहीं करने) की अनुमति देगा।
सिरो सेंटिल्ली 郝海东 冠状 iro 事件

@ निक हेनेर क्या आप नीचे दिए गए उत्तरों में से किसी एक को स्वीकार कर सकते हैं?
जेम्स मोंगर

जवाबों:


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 - यह एक अलग प्रश्न के रूप में सबसे अच्छा पूछा जाएगा।
मैकडॉवेल

2
@JeffAxelrod, शायद ऐतिहासिक कारणों से क्योंकि जावा को C ++ के बाद बनाया गया था ... इस पोस्ट को देखें: stackoverflow.com/questions/2687392/…
क्रिस्टोफ रूसो

3
एक ब्लॉक का उपयोग करने के लिए +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++) {

1
न तो संकलन होगा: उपयोग से पहले आपको वैरिएबल को इनिशियलाइज़ करना होगा।
अनबेली

@ अच्छी तरह से, मैं मैनुअल कोड संकलन में अभ्यास नहीं कर रहा था :) मैं सिर्फ विचार देना चाहता था।
निकिता रियाब

3
@unbeli: बस स्पष्ट करने के लिए: currentIndex को शुरू करने की आवश्यकता है। निकिता ने पहली बात यह है कि "currentIndex ++" है, जो स्वाभाविक रूप से सवाल उठाता है, वेतन वृद्धि क्या है? वर्तमान ठीक है क्योंकि पहला उपयोग इसे पहले सेट करना है।
Jay

लूप के लिए एक इंक्रीप्शन लिखने के लिए आमतौर पर, किसी को ++ संस्करण का उपयोग करना चाहिए क्योंकि संकलक से संकेतन 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
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.