2012-02-21 33 views
6

Giả sử tôi có List<SomeObject> a.
Bây giờ cũng giả sử rằng tôi có một số khác List<SomeProcessor> b.
Mỗi SomeProcessor sử dụng a để xử lý.Java: Cách tốt nhất/thanh lịch để lặp qua 2 danh sách

Bên cạnh đó:

int idx = 0; 
for(SomeProcessor o:b){ 
    o2 = a.get(idx); 
    o.doSomething(o2); 
    idx++; 
} 

Có cách thanh lịch hơn để xử lý này?

+0

không hỗ trợ giao diện Iterable? – Wint

+0

Không. Nó chỉ là một đối tượng tùy chỉnh. Làm thế nào mà có thể giúp tôi? Tôi có nghĩa là nên có một? – Jim

+1

Xem câu trả lời này: http://stackoverflow.com/a/8104205/1029272 Dễ thực hiện và hoạt động tốt. Tôi đã thiết lập và chạy trong vòng 5 phút cuối cùng để dùng thử. – Deco

Trả lời

7
public interface Processor<T> { 
    public void process(T object); 
} 

Và sau đó là một phương pháp helper:

public static <T> void processAll(Collection<T> items, Collection<? extends Processor<T>> processors) { 
    Iterator<T> i = items.iterator(); 
    Iterator<? extends Processor<T>> p = processors.iterator(); 
    while(i.hasNext() && p.hasNext()) 
     p.next().process(i.next()); 
} 

Bạn có thể đặt rằng phương pháp helper trên lớp trong đó sử dụng nó, nếu có chỉ là một (và làm cho nó private), hoặc đặt nó một tiện ích lớp được chia sẻ bởi toàn bộ chương trình.

Tất nhiên có các cách khác để mã processAll; ví dụ: bạn có thể sử dụng vòng lặp for trên một trong các bộ sưu tập. Nhưng trong mọi trường hợp, việc phá vỡ mã mức thấp này ra thành một phương thức trợ giúp sẽ làm cho mã của bạn cao hơn sạch hơn và ít "ồn ào hơn". Và nếu bạn đang làm một cái gì đó tương tự trong nhiều phần của chương trình, họ có thể chia sẻ phương thức trợ giúp.

+0

Tôi không muốn để xử lý nó như thế. Tôi cần xử lý từng đối tượng một lần bằng 1 bộ xử lý – Jim

+0

b.size() == a.size() ??? –

+0

@ narek.gevorgyan: Vâng, chúng luôn có cùng kích thước – Jim

1

Nếu bạn có thể tạo một Map<SomeObject, SomeProcessor> thay vì hai danh sách, sau đó nó sẽ được thanh lịch. Điều này có thể không áp dụng, nhưng tôi sẽ chỉ cho nó một shot.

1

lẽ bạn có thể thử với cách đơn giản này:

int idx = 0; 
while(idx<a.size() && idx<b.size()){ 
    b.get(idx).doSomething(a.get(idx++)); 
} 
Các vấn đề liên quan