2009-11-30 35 views
18

When Tôi dụng JDK5 như belowJava foreach loop: cho (Integer i: list) {...}

ArrayList<Integer> list = new ArrayList<Integer>(); 
    for (Integer i : list) { 

     //cannot check if already reached last item 

    } 

on các other hand if Tôi just dụng một Iterator

ArrayList<Integer> list = new ArrayList<Integer>(); 
    for (Iterator i = list.iterator(); i.hasNext();) { 

      //i can check whether this is last item 
      if(i.hasNextItem()){ 
      } 

    } 

How tôi có thể kiểm tra xem tôi đã đạt mục cuối cùng với for (Integer i : list) {

Trả lời

36

một cách để làm điều đó là sử dụng một bộ đếm:

ArrayList<Integer> list = new ArrayList<Integer>(); 
... 
int size = list.size(); 
for (Integer i : list) { 
    ... 
    if (--size == 0) { 
     // Last item. 
     ... 
    } 
} 

Sửa

Dù sao, như Tom Hawtin nói, nó là đôi khi tốt hơn để sử dụng cú pháp "cũ" khi bạn cần để có được những thông tin chỉ số hiện tại, bằng cách sử dụng một vòng lặp for hoặc iterator, như tất cả mọi thứ bạn giành chiến thắng khi sử dụng cú pháp Java5 sẽ bị mất trong vòng lặp chính nó ...

for (int i = 0; i < list.size(); i++) { 
    ... 

    if (i == (list.size() - 1)) { 
     // Last item... 
    } 
} 

hoặc

for (Iterator it = list.iterator(); it.hasNext();) { 
    ... 

    if (!it.hasNext()) { 
     // Last item... 
    } 
} 
+1

nên không có được it.hasNext() để xác định mục cuối cùng? –

+0

Bạn hoàn toàn đúng. Đã chỉnh sửa. Cảm ơn! – romaintaz

+0

Và 'i == list.size() - 1' trong ví dụ khác (các trình vòng lặp thường dễ dàng hơn để có được quyền hơn các chỉ mục, mặc dù cú pháp hơi dài một chút). –

10

Đôi khi tốt hơn là sử dụng trình lặp.

(Bị cáo buộc, "85%" các yêu cầu cho một chỉ số trong sang trọng cho vòng lặp là để thực hiện một String tham gia phương pháp (mà bạn có thể dễ dàng làm mà không có).)

+3

Hoặc bạn có thể thực hiện với apache commons StringUtils.join;) – phtrivier

+0

phtrivier: Nếu bạn đã phụ thuộc vào Apache Commons Lang. Tôi sẽ không giới thiệu một sự phụ thuộc chỉ vì điều đó. –

+0

@Tom - Vẫn còn một sự tham gia cũ ** hack ** phù hợp với các biểu thức: 'String join =" x "; StringBuilder buf = new StringBuilder(); cho (Số nguyên i: x) buf.append (i) .append (tham gia); String result = buf.substring (0, buf.length() - join.length()); ' –

4

API không hỗ trợ trực tiếp . Bạn có thể sử dụng cho (int i ..) vòng lặp và đếm các yếu tố hoặc sử dụng danh sách con (0, kích thước - 1) và xử lý các yếu tố cuối cùng một cách rõ ràng:

if(x.isEmpty()) return; 
    int last = x.size() - 1; 
    for(Integer i : x.subList(0, last)) out.println(i); 
    out.println("last " + x.get(last)); 

này chỉ hữu ích nếu nó không giới thiệu dự phòng. Nó thực hiện tốt hơn so với phiên bản đếm (sau khi chi phí của subList được khấu hao). (Chỉ trong trường hợp bạn chăm sóc sau khi đấm bốc anyway).

+0

Tốt, nhưng bạn nên thêm một kiểm tra rằng danh sách có ít nhất một phần tử (hoặc có khả năng, không trống). –

+0

Ồ vâng, tôi sẽ thêm điều đó. –

3

Một cách khác, bạn có thể sử dụng một đối tượng pass-through để nắm bắt những giá trị cuối cùng và sau đó làm điều gì đó với nó:

List<Integer> list = new ArrayList<Integer>(); 
Integer lastValue = null; 
for (Integer i : list) { 
    // do stuff 
    lastValue = i; 
} 
// do stuff with last value 
+1

Tôi nghĩ rằng anh ấy muốn làm điều trị cụ thể bên trong vòng lặp khi anh ta đến mục cuối cùng, không nhận được số nguyên cuối cùng của danh sách. Đối với điều đó, bạn cũng có thể làm 'list.get (list.size() - 1);' – romaintaz

+0

Tôi hiểu, tuy nhiên tôi đang hiển thị ở đây ý tưởng chung về việc chụp đối tượng cuối cùng. Câu hỏi này hơi mơ hồ theo nghĩa đó rằng anh ấy không thực sự nói điều anh ta muốn làm, chỉ là cách anh ta muốn làm điều đó. – Esko

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