Java: Khởi tạo nhiều biến trong init vòng lặp for?


91

Tôi muốn có hai biến vòng lặp thuộc các kiểu khác nhau. Có cách nào để làm cho việc này hoạt động?

@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();
}

firstgì? Nó không được khai báo ở bất cứ đâu. Nó là một thành viên trong lớp?
extraneon

7
Bạn nên chấp nhận một câu trả lời bên dưới
Mr_and_Mrs_D

Và không giống như C, Java không có toán tử dấu phẩy: stackoverflow.com/questions/12601596/… , cho phép khởi tạo (nhưng không khai báo) hai biến có kiểu khác nhau.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

@Nick Heiner Bạn có thể vui lòng đánh dấu một trong những câu trả lời dưới đây là được chấp nhận không?
James Monger

Câu trả lời:


105

Việc khởi tạo mộtfor câu lệnh tuân theo các quy tắc cho khai báo biến cục bộ .

Điều này sẽ hợp pháp (nếu ngớ ngẩn):

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

Nhưng việc cố gắng khai báo các kiểu Nodeintkiểu riêng biệt như bạn muốn là không hợp pháp cho các khai báo biến cục bộ.

Bạn có thể giới hạn phạm vi của các biến bổ sung trong các phương thức bằng cách sử dụng một khối như sau:

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

Điều này đảm bảo rằng bạn không vô tình sử dụng lại biến ở nơi khác trong phương thức.


10
Bất cứ ai có bất kỳ ý tưởng tại sao các nhà thiết kế ngôn ngữ thực hiện ràng buộc dường như không cần thiết này?
Jeff Axelrod

@glenviewjeff - tốt nhất nên được hỏi dưới dạng một câu hỏi riêng biệt.
McDowell

2
@JeffAxelrod, có thể vì lý do lịch sử vì Java được mô phỏng theo C ++ ... hãy xem bài đăng này: stackoverflow.com/questions/2687392/…
Christophe Roussy

3
1 cho việc sử dụng một khối, tôi sử dụng chúng rất nhiều, vẫn tốt hơn là làm sai lầm ngớ ngẩn
Christophe Roussy

18

Bạn không thể thích điều này. Hoặc bạn sử dụng nhiều biến cùng kiểu for(Object var1 = null, var2 = null; ...)hoặc bạn trích xuất biến khác và khai báo nó trước vòng lặp for.


9

Chỉ cần di chuyển các khai báo biến ( Node<T> current, int currentIndex) ra bên ngoài vòng lặp và nó sẽ hoạt động. Một cái gì đó như thế này

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

hoặc thậm chí có thể

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

1
Sẽ không biên dịch: bạn phải khởi tạo các biến trước khi sử dụng.
unbeli

@unbeli tốt, tôi đã không thực hành trong việc biên dịch mã thủ công :) Tôi chỉ muốn đưa ra ý tưởng.
Nikita Rybak

3
@unbeli: Chỉ cần làm rõ: currentIndex cần được khởi tạo. Điều đầu tiên Nikita làm với nó là "currentIndex ++", điều này tự nhiên đưa ra câu hỏi, tăng cái gì? hiện tại là ổn vì lần sử dụng đầu tiên là đặt nó thành trước.
Jay

Thông thường, để viết một số tăng tốt hơn trong vòng lặp for, người ta nên sử dụng ++ var làm ký hiệu var ++ được yêu cầu từ trình biên dịch để sao chép nội dung của var trước khi tăng nó để trả về nó như là kết quả của biểu thức mặc dù không ai muốn điều đó. Tất nhiên, trình biên dịch sẽ tối ưu hóa điều đó nhưng nó giống như vứt rác trên đường chờ người khác dọn dẹp.
Chucky

5

Các biến được khai báo trong khối khởi tạo phải cùng kiểu

chúng ta không thể khởi tạo các kiểu dữ liệu khác nhau trong vòng lặp for theo thiết kế của chúng. Tôi chỉ đưa ra một ví dụ nhỏ.

for(int i=0, b=0, c=0, d=0....;/*condition to be applied */;/*increment or other logic*/){
      //Your Code goes here
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.