2013-08-04 31 views
5

Chúng ta có thể sử dụng cái cũ cho vòng lặp (for(i = 0, j = 0; i<30; i++,j++)) với hai biến Chúng ta có thể sử dụng cho-mỗi vòng lặp (hoặc tăng cường cho vòng lặp) trong java (for(Item item : items) với hai biến? Gì cú pháp cho rằng?Có thể sử dụng vòng lặp mới trong Java với hai biến không?

+4

Nó không phải là một 'mới cho loop', nó là cơ bản một vòng lặp foreach. Bạn không thể. – MightyPork

+1

@MightyPork Nó được tăng cường cho vòng lặp *. –

+0

tên thay đổi mục đích và sử dụng của nó như thế nào? nó tương đương với vòng lặp foreach. – MightyPork

Trả lời

7

Thật không may, Java chỉ hỗ trợ sơ bộ foreach vòng lặp, được gọi là tăng cường cho vòng lặp. Các ngôn ngữ khác, đặc biệt là các ngôn ngữ FP như Scala, hỗ trợ cấu trúc được gọi là danh sách hiểu (Scala gọi nó là để hiểu) cho phép lặp lồng nhau cũng như lọc các phần tử trên đường đi.

9

Không bạn không thể. đó là cú pháp đường cho việc sử dụng Iterator. tham khảo here cho một câu trả lời tốt về vấn đề này.

bạn cần có một đối tượng có chứa cả hai biến.

Nó có thể được hiển thị trên một đối tượng Bản đồ ví dụ:

for (Map.Entry<String,String> e: map.entrySet()) { 
    // you can use e.getKey() and e.getValue() here 
} 
+0

'Bản đồ' không thực thi' Iterable'. – BalusC

+0

Chắc chắn, cảm ơn bạn rất nhiều! Sửa lỗi ví dụ của tôi – Tala

+0

Mục nhập đã thực hiện. – arynaq

1

Vòng lặp foreach giả định rằng chỉ có một tập hợp các sự vật. Bạn có thể làm điều gì đó cho mỗi phần tử cho mỗi lần lặp lại. Bạn muốn nó hoạt động như thế nào nếu bạn có thể lặp qua hai bộ sưu tập cùng một lúc? Điều gì sẽ xảy ra nếu họ có những lenghts khác nhau?

Giả sử rằng bạn có

Collection<T1> collection1; 
Collection<T2> collection2; 

Bạn có thể viết một wrapper iterable đó lặp trên cả hai và trả về một số loại kết quả sáp nhập.

for(TwoThings<T1, T2> thing : new TwoCollectionWrapper(collection1, collection2) { 
    // one of them could be null if collections have different length 
    T1 t1 = thing.getFirst(); 
    T2 t2 = thing.getSecond(); 
} 

Đó là điều gần nhất tôi nghĩ nhưng tôi không thấy nhiều việc sử dụng cho điều đó. Nếu cả hai bộ sưu tập có nghĩa là để được lặp lại với nhau, nó sẽ được đơn giản hơn để tạo ra một Collection<TwoThings> ở nơi đầu tiên.

Ngoài việc lặp song song, bạn cũng có thể muốn lặp lại tuần tự. Có những triển khai cho điều đó, ví dụ: Của Guava Iterables.concat()

1

Câu trả lời đơn giản "Không" đã được đưa ra. Nhưng bạn có thể thực hiện lấy hai vòng lặp làm đối số và trả về các cặp của các phần tử đến từ hai trình vòng lặp. Ghép nối thành một lớp với hai trường. Bạn sẽ phải thực hiện chính mình, hoặc nó có thể tồn tại trong một số commache apache hoặc lib tương tự.

Iterator mới này có thể được sử dụng trong vòng lặp foreach.

2

Sau đây nên có tác dụng tương tự (hiệu suất) mà bạn đang cố gắng để đạt được:

List<Item> aItems = new List<Item>(); 
List<Item> bItems = new List<Item>(); 
... 
Iterator aIterator = aItems.iterator(); 
Iterator bIterator = bItems.iterator(); 
while (aIterator.hasNext() && bIterator.hasNext()) { 
    Item aItem = aIterator.next(); 
    Item bItem = bIterator.next(); 
} 
Các vấn đề liên quan