2009-09-04 40 views
45

Vòng lặp for-each có đảm bảo rằng các phần tử sẽ được trình bày theo thứ tự nếu được gọi trên danh sách không? Trong các thử nghiệm của tôi nó dường như, nhưng tôi dường như không thể tìm thấy điều này đề cập một cách rõ ràng trong bất kỳ tài liệuJava cho mỗi vòng lặp: Sắp xếp thứ tự

List<Integer> myList;// [1,2,3,4] 
for (Integer i : myList) { 
    System.out.println(i.intValue()); 
} 

#output 
1,2,3,4 

Trả lời

46

Có. Vòng lặp foreach sẽ lặp qua danh sách theo thứ tự được cung cấp bởi phương thức iterator(). Xem documentation for the Iterable interface.

Nếu bạn nhìn vào Javadoc for List bạn có thể thấy danh sách là "bộ sưu tập được sắp xếp" và phương thức iterator() trả về trình lặp lặp lại "theo trình tự thích hợp".

3

Bạn có thể sử dụng một vòng lặp for, a la for (int i = 0; i < myList.length(); i++) nếu bạn muốn làm điều đó một cách ra lệnh. Mặc dù, theo như tôi biết, foreach nên làm điều đó theo thứ tự.

+0

vâng nhưng điều đó thực sự xấu xí, tôi muốn chắc chắn hơn về mỗi – Mike

15

Vòng lặp foreach sẽ sử dụng trình lặp được tích hợp vào Collection, vì vậy thứ tự bạn nhận được kết quả sẽ phụ thuộc vào việc có hay không Collection duy trì một số loại lệnh nào đó cho các phần tử.

Vì vậy, nếu bạn đang lặp qua một ArrayList, bạn sẽ nhận được các mục theo thứ tự chúng được chèn (giả sử bạn không tiếp tục sắp xếp ArrayList). Nếu bạn đang lặp qua một số HashSet, tất cả các cược sẽ bị tắt, vì HashSets không duy trì bất kỳ thứ tự nào.

Nếu bạn cần đảm bảo đơn đặt hàng cho các thành phần trong Bộ sưu tập, hãy xác định Comparator để thiết lập đơn đặt hàng đó và sử dụng Collections.sort(Collection<T>, Comparator<? super T>).

10

Vâng, thông số kỹ thuật ngôn ngữ Java đảm bảo rằng

for (Iterator<Whatever> i = c.iterator(); i.hasNext();) 
    whatEver(i.next()); 

tương đương với

for (Whatever x : c) 
    whatEver(x); 

không có "sự thay đổi trong trật tự" được cho phép.

Các vấn đề liên quan