Java: เริ่มต้นตัวแปรหลายตัวในสำหรับ loop init?


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

และแตกต่างจาก C Java ไม่มีตัวดำเนินการลูกน้ำ: stackoverflow.com/questions/12601596/…ซึ่งจะอนุญาตให้เริ่มต้น (แต่ไม่ประกาศ) ตัวแปรสองประเภทที่แตกต่างกัน
Ciro Santilli 郝海东冠状病六四事件法轮功

@ นิคไฮเนอร์คุณช่วยทำเครื่องหมายคำตอบด้านล่างว่ายอมรับได้หรือไม่
James 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
ใครมีความคิดว่าทำไมนักออกแบบภาษาจึงใช้ข้อ จำกัด ที่ดูเหมือนไม่จำเป็นนี้?
Jeff Axelrod

@glenviewjeff - ที่ดีที่สุดคือถามเป็นคำถามแยกต่างหาก
McDowell

2
@JeffAxelrod อาจเป็นเพราะเหตุผลทางประวัติศาสตร์เพราะ Java ถูกจำลองตาม C ++ ... ดูโพสต์นี้: stackoverflow.com/questions/2687392/…
Christophe Roussy

3
+1 สำหรับการใช้บล็อกฉันใช้มันมากยังดีกว่าทำผิดพลาดโง่ ๆ
Christophe Roussy

18

แบบนี้ไม่ได้นะ ไม่ว่าคุณจะใช้ตัวแปรประเภทเดียวกันหลายตัวfor(Object var1 = null, var2 = null; ...)หรือคุณแยกตัวแปรอื่นแล้วประกาศไว้หน้า for loop


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
จะไม่รวบรวม: คุณต้องเริ่มต้นตัวแปรก่อนใช้งาน
เชื่อ

@unbeli ดีฉันไม่ได้ออกกำลังกายในการรวบรวมรหัสด้วยตนเอง :) ฉันแค่อยากจะให้ความคิด
Nikita Rybak

3
@unbeli: เพื่อชี้แจง: currentIndex จำเป็นต้องเริ่มต้น สิ่งแรกที่ Nikita ทำกับมันคือ "currentIndex ++" ซึ่งจะทำให้เกิดคำถามขึ้นมาโดยธรรมชาติคืออะไร? ปัจจุบันใช้ได้ดีเพราะการใช้งานครั้งแรกจะต้องตั้งค่าเป็นครั้งแรก
Jay

โดยปกติแล้วในการเขียนส่วนเพิ่มใน for loop ให้ดีขึ้นควรใช้ ++ var เป็นสัญกรณ์ var ++ ที่ต้องการจากคอมไพเลอร์เพื่อทำซ้ำเนื้อหาของ var ก่อนที่จะเพิ่มขึ้นเพื่อส่งคืนเป็นผลลัพธ์ของนิพจน์แม้ว่าจะไม่มีใครต้องการสิ่งนั้นก็ตาม แน่นอนว่าคอมไพเลอร์จะปรับให้เหมาะสมที่สุด แต่ก็เหมือนกับการทิ้งขยะบนท้องถนนเพื่อรอให้ผู้อื่นมาทำความสะอาด
Chucky

5

ตัวแปรที่ประกาศในบล็อกการเริ่มต้นต้องเป็นประเภทเดียวกัน

เราไม่สามารถเริ่มต้นข้อมูลประเภทต่างๆใน for loop ได้ตามการออกแบบ ฉันแค่วางตัวอย่างเล็ก ๆ

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.