如何使用JavaScript循环遍历数组中的所有条目?
我以为它是这样的:
forEach(instance in theArray)
Run Code Online (Sandbox Code Playgroud)
theArray
我的阵列在哪里,但这似乎是不正确的.
可能重复:
如何有效地迭代"地图"中的每个条目?
迭代一个项目的最佳方法是HashMap
什么?
如果我有一个Map
用Java 实现接口的对象,并希望迭代其中包含的每一对,那么通过地图的最有效方法是什么?
元素的排序是否取决于我对界面的具体映射实现?
让我通过说我知道它是什么foreach
,做什么以及如何使用它来加上前缀.这个问题涉及它如何在发动机罩下工作,我不希望任何答案都是"这就是你如何循环阵列foreach
".
很长一段时间,我认为这foreach
与数组本身一起工作.然后我发现许多引用它的数据副本的事实,我已经假设这是故事的结尾.但是我最近讨论了这个问题,经过一些实验后发现这实际上并非100%正确.
让我说明我的意思.对于以下测试用例,我们将使用以下数组:
$array = array(1, 2, 3, 4, 5);
Run Code Online (Sandbox Code Playgroud)
foreach ($array as $item) {
echo "$item\n";
$array[] = $item;
}
print_r($array);
/* Output in loop: 1 2 3 4 5
$array after loop: 1 2 3 4 5 1 2 3 4 5 */
Run Code Online (Sandbox Code Playgroud)
这清楚地表明我们不直接使用源数组 - 否则循环将永远持续,因为我们在循环期间不断地将项目推送到数组.但只是为了确保这种情况:
foreach ($array as $key => $item) {
$array[$key + 1] = $item + 2;
echo "$item\n";
}
print_r($array);
/* Output …
Run Code Online (Sandbox Code Playgroud) 我被告知不要for...in
在JavaScript中使用数组.为什么不?
我们都知道你不能这样做:
for (Object i : l) {
if (condition(i)) {
l.remove(i);
}
}
Run Code Online (Sandbox Code Playgroud)
ConcurrentModificationException
等等......这显然有时起作用,但并非总是如此.这是一些特定的代码:
public static void main(String[] args) {
Collection<Integer> l = new ArrayList<>();
for (int i = 0; i < 10; ++i) {
l.add(4);
l.add(5);
l.add(6);
}
for (int i : l) {
if (i == 5) {
l.remove(i);
}
}
System.out.println(l);
}
Run Code Online (Sandbox Code Playgroud)
当然,这会导致:
Exception in thread "main" java.util.ConcurrentModificationException
Run Code Online (Sandbox Code Playgroud)
...即使多线程没有这样做......无论如何.
什么是这个问题的最佳解决方案?如何在循环中从集合中删除项而不抛出此异常?
我也在Collection
这里使用任意,不一定是ArrayList
,所以你不能依赖get
.
我正在迭代Python中的元组列表,并且如果它们符合某些条件,我会尝试删除它们.
for tup in somelist:
if determine(tup):
code_to_remove_tup
Run Code Online (Sandbox Code Playgroud)
我应该用什么代替code_to_remove_tup
?我无法弄清楚如何以这种方式删除项目.
对于Java语言有些新意,我试图让自己熟悉一个可能遍历列表(或者可能是其他集合)以及每个集合的优点或缺点的所有方法(或者至少是非病态方法).
给定一个List<E> list
对象,我知道以下循环所有元素的方法:
while
/ do while
循环以及)// Not recommended (see below)!
for (int i = 0; i < list.size(); i++) {
E element = list.get(i);
// 1 - can call methods of element
// 2 - can use 'i' to make index-based calls to methods of list
// ...
}
Run Code Online (Sandbox Code Playgroud)
注意:正如@amarseillan指出的那样,这种形式对于迭代List
s来说是一个糟糕的选择,因为该get
方法的实际实现可能不如使用时那样有效Iterator
.例如,LinkedList
实现必须遍历i之前的所有元素以获得第i个元素.
在上面的例子中,List
实现没有办法"保存它的位置"以使未来的迭代更有效.因为ArrayList
它并不重要,因为复杂性/成本get
是恒定时间(O(1)),而a LinkedList
是它与列表的大小(O(n))成比例.
有关内置Collections
实现的计算复杂性的更多信息,请查看此问题 …
在C++中,我可以迭代std::string
这样:
std::string str = "Hello World!";
for (int i = 0; i < str.length(); ++i)
{
std::cout << str[i] << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
如何在Python中迭代字符串?
iteration ×10
loops ×5
java ×4
collections ×3
python ×3
arrays ×2
foreach ×2
javascript ×2
dictionary ×1
for-loop ×1
hashmap ×1
php ×1
string ×1