gpt4 book ai didi

java - 连续迭代集合和数组的最佳方法

转载 作者:行者123 更新时间:2023-11-30 01:42:55 25 4
gpt4 key购买 nike

这是一个非常琐碎的问题,与编码风格相关,我只是要求使我的编码风格更具可读性

假设我有一个像 linkedList 这样的集合和一个数组,并且我需要同时迭代两者。
目前我知道的最好方法是在列表上获取迭代器并在迭代器循环之外定义索引变量,并同时递增索引变量以访问下一个元素{列表和数组}。
请引用下面的例子

LinkedList<Integer> list = new LinkedList<Integer>();
Integer[] arr = new Array[25];
// lets suppose both have 25 elements.

// My Iteration method will be
int index =0;

for (Integer val : list) {
System.out.println(val);
System.out.println(arr[index++]);
}


这是唯一的方法还是有其他方法可以以更具可读性和更相关的方式执行此迭代,而无需单独获取索引变量。
我知道数组可能比集合具有更少或更多的元素,但我只讨论它们相等并且我们需要迭代它们的情况。

PS:任何人都可以编写计算机可以理解的代码,真正的挑战是编写人类可以轻松理解的代码。

最佳答案

你所拥有的基本上很好:它很简单,而且简单足以使代码可读。

我唯一要注意的是 arr[index++]index++ 的副作用:例如,如果您想在循环体,你不能简单地复制+粘贴。

考虑取出一个变量作为循环中的第一件事来存储“当前”数组元素(这本质上是增强的 for 循环对列表元素所做的事情)。

for (Integer val : list) {
Integer fromArr = arr[index++];

// ...
}
<小时/>

只是为了指出一种无需单独的索引变量的替代方案,您可以使用 ListIterator,它为您提供元素的索引。

// Assuming list and are have same number of elements.
for (ListIterator<Integer> it = list.listIterator();
it.hasNext();) {
// The ordering of these statements is important, because next() changes nextIndex().
Integer fromArr = arr[it.nextIndex()];
Integer val = it.next();

// ...
}
不过,

ListIterator 并不是一个特别广泛使用的类;它的使用本身可能会令人困惑。

<小时/>

ListIterator 方法的缺点之一是您必须正确使用 it:您不应该在循环内触摸它(在获取值之后) ,您必须将语句按正确的顺序排列,等等。

另一种方法是创建一个类似于 Python 的 enumerate 的库方法:

static <T> Iterable<Map.Entry<Integer, T>> enumerate(Iterable<? extends T> iterable) {
return () -> new Iterator<T>() {
int index = 0;
Iterator<? extends T> delegate = iterable.iterator();

@Override public boolean hasNext() { return delegate.hasNext(); }

@Override public Map.Entry<Integer, T> next() {
return new AbstractMap.SimpleEntry<>(index++, delegate.next());
}
};
}

这会返回一个可迭代的映射条目,其中键是索引,值是相应的值。

然后您可以在增强的 for 循环中使用它:

for (Map.Entry<Integer, Integer> entry : enumerate(list)) {
Integer fromList = entry.getValue();
Integer fromArr = arr[entry.getKey()];
}

关于java - 连续迭代集合和数组的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59299611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com