标签: iterator

在迭代期间向集合添加元素

是否可以在迭代时向元素添加元素?

更具体地说,我想迭代一个集合,如果一个元素满足某个条件,我想在集合中添加一些其他元素,并确保迭代这些添加的元素.(我意识到这可能导致一个无终止的循环,但我很确定它不会在我的情况下.)

Sun 的Java教程表明这是不可能的:"请注意,这Iterator.remove是在迭代期间修改集合的唯一安全方法;如果在迭代进行过程中以任何其他方式修改基础集合,则行为未指定."

所以如果我不能用迭代器做我想做的事,你建议我做什么?

java iterator

76
推荐指数
5
解决办法
13万
查看次数

增强的for语句如何为数组工作,以及如何获取数组的迭代器?

给出以下代码段:

int[] arr = {1, 2, 3};
for (int i : arr)
    System.out.println(i);
Run Code Online (Sandbox Code Playgroud)

我有以下问题:

  1. 以上for-each循环如何工作?
  2. 如何在Java中获取数组的迭代器?
  3. 数组是否转换为列表以获取迭代器?

java arrays foreach iterator

76
推荐指数
9
解决办法
17万
查看次数

迭代列表中的所有连续项对

给出一个清单

l = [1, 7, 3, 5]
Run Code Online (Sandbox Code Playgroud)

我想迭代所有连续列表项对(1,7), (7,3), (3,5),即

for i in xrange(len(l) - 1):
    x = l[i]
    y = l[i + 1]
    # do something
Run Code Online (Sandbox Code Playgroud)

我想以更紧凑的方式做到这一点,比如

for x, y in someiterator(l): ...
Run Code Online (Sandbox Code Playgroud)

有没有办法使用内置的Python迭代器来做到这一点?我确定该itertools模块应该有一个解决方案,但我无法弄明白.

python iterator list

76
推荐指数
3
解决办法
3万
查看次数

是否可以使用foreach从第一个元素开始迭代?

我正在考虑为我的自定义集合(树)实现IEnumerable,所以我可以使用foreach来遍历我的树.但据我所知,foreach总是从集合的第一个元素开始.我想选择foreach从哪个元素开始.有可能以某种方式改变foreach开始的元素吗?

c# ienumerable iterator

75
推荐指数
3
解决办法
5万
查看次数

元组在地图操作中解包

我经常发现自己与元组的列表,序列和迭代器一起工作,并希望做类似以下的事情,

val arrayOfTuples = List((1, "Two"), (3, "Four"))
arrayOfTuples.map { (e1: Int, e2: String) => e1.toString + e2 }
Run Code Online (Sandbox Code Playgroud)

但是,编译器似乎从不同意这种语法.相反,我最终写作,

arrayOfTuples.map { 
    t => 
    val e1 = t._1
    val e2 = t._2
    e1.toString + e2 
}
Run Code Online (Sandbox Code Playgroud)

这真是太傻了.我怎么能绕过这个?

iterator scala tuples map iterable-unpacking

72
推荐指数
5
解决办法
3万
查看次数

为什么JavaScript中的对象不可访问?

为什么默认情况下对象不可迭代?

我一直看到与迭代对象有关的问题,常见的解决方案是迭代对象的属性并以这种方式访问​​对象中的值.这似乎很常见,它让我想知道为什么对象本身不可迭代.

for...of默认情况下,像ES6 这样的语句很适合用于对象.因为这些功能仅适用于不包含{}对象的特殊"可迭代对象" ,所以我们必须通过箍来使这个对我们想要使用它的对象起作用.

for ... of语句创建一个循环迭代可迭代对象 (包括Array,Map,Set,arguments对象等)......

例如,使用ES6 生成器功能:

var example = {a: {e: 'one', f: 'two'}, b: {g: 'three'}, c: {h: 'four', i: 'five'}};

function* entries(obj) {
   for (let key of Object.keys(obj)) {
     yield [key, obj[key]];
   }
}

for (let [key, value] of entries(example)) {
  console.log(key);
  console.log(value);
  for (let [key, value] of entries(value)) {
    console.log(key);
    console.log(value);
  }
}
Run Code Online (Sandbox Code Playgroud)

当我在Firefox(支持ES6)中运行代码时,上面按照我期望的顺序正确记录数据:

hacky的输出

默认情况下,{}对象不可迭代,但为什么?缺点是否超过了可迭代对象的潜在好处?与此相关的问题是什么?

此外,由于{}对象是从"阵列状"集合和"可迭代的对象",如不同NodeList,HtmlCollection以及arguments …

javascript arrays iterator ecmascript-5 ecmascript-6

72
推荐指数
4
解决办法
5万
查看次数

迭代器和枚举器之间的区别

.NET 3.5作业的面试问题是"迭代器和枚举器之间有什么区别"?

这是一个核心区别,LINQ等等.

无论如何,有什么区别?我似乎无法在网上找到一个可靠的定义.毫无疑问,我可以找到两个术语的含义,但我得到的答案略有不同.面试的最佳答案是什么?

IMO迭代器"迭代"集合,枚举器提供迭代功能,但必须调用它.

此外,使用yield关键字据说可以保存状态.究竟是什么状态?是否有这种好处的例子?

.net c# iterator enumeration generator

71
推荐指数
6
解决办法
4万
查看次数

如何使用迭代器?

我正在计算两点之间的距离.我用C++中的向量存储的两点:(0,0)和(1,1).

我应该得到结果

0
1.4
1.4
0
Run Code Online (Sandbox Code Playgroud)

但我得到的实际结果是

0
1
-1
0
Run Code Online (Sandbox Code Playgroud)

我认为在向量中使用迭代器的方式有问题.我该如何解决这个问题?

我发布了以下代码.

typedef struct point {
    float x;
    float y;
} point;

float distance(point *p1, point *p2)
{
    return sqrt((p1->x - p2->x)*(p1->x - p2->x) +
                (p1->y - p2->y)*(p1->y - p2->y));
}

int main()
{
    vector <point> po;
    point p1; p1.x = 0; p1.y = 0;
    point p2; p2.x = 1; p2.y = 1;
    po.push_back(p1);
    po.push_back(p2);

    vector <point>::iterator ii;
    vector <point>::iterator jj;
    for (ii = po.begin(); ii != po.end(); ii++) …
Run Code Online (Sandbox Code Playgroud)

c++ pointers iterator vector using-statement

71
推荐指数
3
解决办法
4万
查看次数

在C++ 11基于范围的for循环中查找元素的位置?

假设我有以下代码:

vector<int> list;
for(auto& elem:list) {
    int i = elem;
}
Run Code Online (Sandbox Code Playgroud)

我可以在elem不保持单独迭代器的情况下找到向量中的位置吗?

c++ iterator c++11

71
推荐指数
8
解决办法
4万
查看次数

与python列表混淆:它们还是不是迭代器?

在Nutshell中研究Alex Marteli的Python,书中暗示任何具有next()方法的对象(或者至少可以用作迭代器).它还表明大多数迭代器是通过对被调用方法的隐式或显式调用构建的iter.

在书中读到这篇文章后,我感受到了尝试它的冲动.我启动了一个python 2.7.3解释器,并做到了这一点:

>>> x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> for number in range(0, 10):
...     print x.next()
Run Code Online (Sandbox Code Playgroud)

但结果如下:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
AttributeError: 'list' object has no attribute 'next'
Run Code Online (Sandbox Code Playgroud)

在混乱中,我试图研究x对象的结构,dir(x)我注意到它有一个__iter__函数对象.所以我发现它可以用作迭代器,只要它支持那种类型的接口.

所以当我再次尝试时,这一次略有不同,尝试这样做:

>>> _temp_iter = next(x)
Run Code Online (Sandbox Code Playgroud)

我收到了这个错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list object …
Run Code Online (Sandbox Code Playgroud)

python iterator list

71
推荐指数
4
解决办法
5万
查看次数