gpt4 book ai didi

java - 可以在迭代过程中改变的可迭代集合

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:32:12 24 4
gpt4 key购买 nike

在 Java(如果你知道的话,还有 C#)中是否有一个可以迭代的集合数据结构,具有以下属性:

  • 可以在不影响当前迭代器(已启动迭代器迭代的其余部分)的情况下删除当前元素。
  • 可以添加新元素,但也不会影响当前迭代器——当当前迭代器的迭代仍在进行时,不会作为迭代值包含在内。在我的例子中,每次迭代只会添加一个新元素,但在从可迭代对象中获取新的迭代器之前,不会看到任何元素。
  • 元素的顺序无关紧要。

实际上,有一个传入列表和一个传出项目列表。传入列表被迭代,一些被复制到一个新列表。在迭代过程中可以将一些新元素添加到新列表中。迭代结束后,旧的传入列表被新的传出列表替换。整个过程本身就是一个循环。

因此,与具有这些添加/删除属性的集合对象相比,每次都将元素复制到新构造的集合对象似乎效率低下。

我在考虑某种队列,它可以让我预览当前项目,然后将其出列或不出列,然后移至下一个项目。我可以将更多项目添加到队列的头部,但看不到它们,因为我正在向尾部移动。双向链表可以具有这些属性,对吗?

如果您真的想知道它的用途,那就是在 an answer of mine 中添加第二个大代码块。 .

最佳答案

在 C# 中,使用 List<T> 很容易做到这一点和 for (...)而不是 foreach (...) :

using System;
using System.Collections.Generic;
using System.Linq;

namespace Demo
{
static class Program
{
static void Main()
{
List<int> list = Enumerable.Range(1, 10).ToList();

for (int i = 0; i < list.Count; ++i)
{
if ((list[i] % 3) == 0) // Remove multiples of 3.
list.RemoveAt(i--); // NOTE: Post-decrement i
else if ((list[i] % 4) == 0) // At each multiple of 4, add (2*value+1)
list.Add(list[i] * 2 + 1);
else
; // Do nothing.
}

Console.WriteLine(string.Join(", ", list)); // Outputs 1, 2, 4, 5, 7, 8, 10, 17
}
}
}

这里的关键是使用索引而不是 foreach ,并且在当前索引之前不更改任何内容(根据您的要求,不需要)。

但是,如果您确实需要在当前索引之前添加或删除元素,那么这种方法就不起作用(或者至少,它会变得更加复杂).

关于java - 可以在迭代过程中改变的可迭代集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52253352/

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