Theo đề nghị của jeef3, mô hình hóa sự thật miền thay vì giữ sepa tỷ lệ, danh sách được ghép đôi hoàn toàn là đúng cách để đi ... khi đây là một tùy chọn.
Có nhiều lý do khiến bạn không thể áp dụng phương pháp này. Nếu vậy ...
A. Bạn có thể sử dụng phương pháp gọi lại, theo đề xuất của cletus.
B. Bạn vẫn có thể chọn để hiển thị Iterator hiển thị phần tử đối tượng miền cho từng trường hợp tổng hợp. Cách tiếp cận này không buộc bạn phải giữ một cấu trúc Danh sách song song xung quanh.
private List<String> _names = ...;
private List<Integer> _ages = ...;
Iterator<Person> allPeople() {
final Iterator<String> ni = _names.iterator();
final Iterator<Integer> ai = _ages.iterator();
return new Iterator() {
public boolean hasNext() {
return ni.hasNext();
}
public Person next() {
return new Person(ni.next(), ai.next());
}
public void remove() {
ni.remove();
ai.remove();
}
};
}
C. Bạn có thể sử dụng biến thể này và sử dụng API con trỏ kiểu RowSet. Giả sử IPerson
là giao diện mô tả Người. Sau đó, chúng ta có thể làm:
public interface IPerson {
String getName();
void setName(String name);
...
}
public interface ICursor<T> {
boolean next();
T current();
}
private static class PersonCursor implements IPerson, ICursor<IPerson> {
private final List<String> _names;
...
private int _index = -1;
PersonCursor(List<String> names, List<Integer> ages) {
_names = names;
...
}
public boolean next() {
return ++_index < _names.size();
}
public Person current() {
return this;
}
public String getName() {
return _names.get(_index);
}
public void setName(String name) {
_names.set(0, name);
}
...
}
private List<String> _names = ...;
private List<Integer> _ages = ...;
Cursor<Person> allPeople() {
return new PersonCursor(_names, _ages);
}
Lưu ý rằng phương pháp B cũng được thực hiện để hỗ trợ cập nhật vào danh sách bằng cách giới thiệu một giao diện Domain, và có sự trở lại Iterator 'sống' đối tượng.
Nguồn
2009-09-02 07:17:36
có thể trùng lặp của [Bes t cách để lặp qua hai danh sách cùng một lúc?] (http://stackoverflow.com/questions/3137944/best-way-to-iterate-over-two-lists-simaneously) –
Câu hỏi đó là khác biệt một cách tinh tế: đó là về cách iterate _outside_ một lớp trên hai bộ sưu tập _inside_ một lớp, mà thay đổi giao diện một chút. –