Sean Adkinso..
9
这是一个有趣的练习.我创建了一个名为ParallelList的对象,它接受可变数量的类型化列表,并且可以遍历每个索引处的值(作为值列表返回):
public class ParallelList implements Iterable> {
private final List> lists;
public ParallelList(List... lists) {
this.lists = new ArrayList>(lists.length);
this.lists.addAll(Arrays.asList(lists));
}
public Iterator> iterator() {
return new Iterator>() {
private int loc = 0;
public boolean hasNext() {
boolean hasNext = false;
for (List list : lists) {
hasNext |= (loc < list.size());
}
return hasNext;
}
public List next() {
List vals = new ArrayList(lists.size());
for (int i=0; i
vals.add(loc < lists.get(i).size() ? lists.get(i).get(loc) : null);
}
loc++;
return vals;
}
public void remove() {
for (List list : lists) {
if (loc < list.size()) {
list.remove(loc);
}
}
}
};
}
}
用法示例:
List list1 = Arrays.asList(new Integer[] {1, 2, 3, 4, 5});
List list2 = Arrays.asList(new Integer[] {6, 7, 8});
ParallelList list = new ParallelList(list1, list2);
for (List ints : list) {
System.out.println(String.format("%s, %s", ints.get(0), ints.get(1)));
}
哪个会打印出来:
1, 6
2, 7
3, 8
4, null
5, null
此对象支持可变长度列表,但显然可以将其修改为更严格.
不幸的是我无法摆脱ParallelList构造函数上的一个编译器警告:A generic array of List is created for varargs parameters,所以如果有人知道如何摆脱它,让我知道:)
`@ SuppressWarnings` ;-) (6认同)