使用 foreach 迭代 Java 中并行数组的漂亮方法

2022-09-01 08:47:52

我继承了一堆代码,这些代码广泛使用并行数组来存储键/值对。这样做实际上是有道理的,但是编写循环来迭代这些值有点尴尬。我真的很喜欢新的Java foreach结构,但似乎没有办法使用它来迭代并行列表。

使用正常的循环,我可以很容易地做到这一点:for

for (int i = 0; i < list1.length; ++i) {
    doStuff(list1[i]);
    doStuff(list2[i]);
}

但在我看来,这在语义上不是纯粹的,因为我们在迭代过程中没有检查的边界。有没有一些聪明的语法类似于for-each,我可以用于并行列表?list2


答案 1

我会自己使用一个。但是,请听您的话,一对数组在您的情况下是有意义的,那么采用两个数组并返回包装器的实用程序方法怎么样?MapIterable

概念:

for (Pair<K,V> p : wrap(list1, list2)) {
    doStuff(p.getKey());
    doStuff(p.getValue());
}

包装器将隐藏边界检查。Iterable<Pair<K,V>>


答案 2

从官方 Oracle 页面上的增强型 for 循环:

最后,它不适用于必须并行迭代多个集合的循环。设计师们知道这些缺点,他们有意识地决定采用干净,简单的结构,可以覆盖绝大多数情况。

基本上,您最好使用正常的 for 循环。

如果您使用这些数组对来模拟 Map,则始终可以编写一个类,该类使用两个数组实现 Map 接口。这可以让你抽象出大部分的循环。

如果不看你的代码,我无法告诉你这个选项是否是最好的前进方向,但它是你可以考虑的事情。