- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在学习 Java 第六版中的数据结构和算法时,我尝试自己构建一个链接位置列表。Position 实现 Node 来存储数据。我想构建两个迭代器,一个用于迭代 Position,另一个用于迭代 Position 中的元素。所以我认为可以应用两种 for-each 循环,如下所示:
LinkedPositionalList<String> list = new LinkedPositionalList<>();
list.addFirst("A");
list.addLast("B");
list.addLast("V");
for (Position posi : list.positions()) {
}
for (String str:list ) {
}
事实证明,第二个 for-each 不适用于类型,但第一个效果很好。那么如何让第二个 for-each 迭代器工作呢?
这是我构建此类的代码:p.s.:代码很长。嵌套类的最后一部分试图实现Iterator接口(interface)。之前的代码是构建链接位置列表的方法,我认为这并不重要......
public class LinkedPositionalList<E> implements PositionalList<E> {
private static class Node<E> implements Position<E> {
private E element;
private Node<E> prev;
private Node<E> next;
public Node(E e, Node<E> p, Node<E> n) {
element=e;
prev=p;
next=n;
}
public E getElement() throws IllegalStateException {
if (next == null) {
throw new IllegalStateException("Position no longer valid");
}
return element;
}
public Node<E> getPrev() {
return prev;
}
public Node<E> getNext() {
return next;
}
public void setElement(E e) {
element=e;
}
public void setPrev(Node<E> prev) {
this.prev = prev;
}
public void setNext(Node<E> next) {
this.next=next;
}
}
private Node<E> header;
private Node<E> trailer;
private int size=0;
public LinkedPositionalList() {
header = new Node<>(null, null, null);
trailer = new Node<>(null, header, null);
header.setNext(trailer);
}
private Node<E> validate(Position p)throws IllegalArgumentException {
if (!(p instanceof Node)) {
throw new IllegalArgumentException("Invalid p");
}
Node<E> node=(Node<E>)p;
if (node.getNext() == null) {
throw new IllegalArgumentException("p is no longer in the list");
}
return node;
}
private Position<E> position(Node<E> node) {
if (node == header || node == trailer) {
return null;
}
return node;
}
public int size() {
return size;
}
public boolean isEmpty() {
return size == 0;
}
public Position<E> first() {
return position(header.getNext());
}
public Position<E> last() {
return position(trailer.getPrev());
}
public Position<E> before(Position<E> p) throws IllegalArgumentException {
Node<E> node = validate(p);
return position(node.getPrev());
}
public Position<E> after(Position<E> p) throws IllegalArgumentException {
Node<E> node = validate(p);
return position(node.getNext());
}
public Position<E> addBetween(E e, Node<E> pred, Node<E> succ) {
Node<E> newest = new Node<>(e, pred, succ);
pred.setNext(newest);
succ.setPrev(newest);
size++;return newest;
}
public Position<E> addFirst(E e) {
return addBetween(e, header, header.getNext());
}
public Position<E> addLast(E e) {
return addBetween(e, trailer.getPrev(), trailer);
}
public Position<E> addBefore(Position<E> p, E e) throws IllegalArgumentException {
Node<E> node = validate(p);
return addBetween(e, node.getPrev(), node);
}
public Position<E> addAfter(Position<E> p,E e) throws IllegalArgumentException {
Node<E> node = validate(p);
return addBetween(e,node,node.getNext());
}
public E set(Position<E> p, E e) throws IllegalArgumentException {
Node<E> node = validate(p);
E answer = node.getElement();
node.setElement(e);
return answer;
}
public E remove(Position<E> p)throws IllegalArgumentException {
Node<E> node = validate(p);
Node<E> pre = node.getPrev();
Node<E> succ = node.getNext();
pre.setNext(succ);
succ.setPrev(pre);
size--;
E answer = node.getElement();
node.setNext(null);
node.setPrev(null);
node.setElement(null);
return answer;
}
//Here is the part that I think should be redesigned!!!!
private class PositionIterator implements Iterator<Position<E>> {
private Position<E> cursor = first(); // position of the next element to report
private Position<E> recent = null; // position of last reported element
public boolean hasNext() { return (cursor != null); }
public Position<E> next() throws NoSuchElementException {
if (cursor == null) throw new NoSuchElementException("nothing left");
recent = cursor; // element at this position might later be removed
cursor = after(cursor);
return recent;
}
public void remove() throws IllegalStateException {
if (recent == null) throw new IllegalStateException("nothing to remove");
LinkedPositionalList.this.remove(recent); // remove from outer list
recent = null; // do not allow remove again until next is called
}
} //------------ end of nested PositionIterator class ------------
//---------------- nested PositionIterable class ----------------
private class PositionIterable implements Iterable<Position<E>> {
public Iterator<Position<E>> iterator() { return new PositionIterator(); }
} //------------ end of nested PositionIterable class ------------
public Iterable<Position<E>> positions() {
return new PositionIterable(); // create a new instance of the inner class
}
//---------------- nested ElementIterator class ----------------
private class ElementIterator implements Iterator<E> {
Iterator<Position<E>> posIterator = new PositionIterator();
public boolean hasNext() { return posIterator.hasNext(); }
public E next() { return posIterator.next().getElement(); } // return element!
public void remove() { posIterator.remove(); }
}
public Iterator<E> iterator() { return new ElementIterator(); }
}
最佳答案
对于内置的 Java Collection Framework 类,如果您只需要项目,请使用:
for (String item : list) {
// do something with item
}
要使用显式迭代器(例如,您可以使用迭代器的 remove()
方法),请使用常规的 for
循环:
for (Iterator<String> iter = list.iterator(); iter.hasNext(); ) {
String item = iter.next();
// do something with item
}
当然,您也可以使用while
循环。
对于您的特定类,很难判断上述内容是否适用,因为您尚未发布 PositionalList
的定义。
关于java迭代器无法应用于for_each,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44611117/
这行得通,for_each 传递 vector std::vector v(10, 1); std::vector > vv(10, v); auto vvit = vv.begin(); std::
主要思想是在GitHub存储库中为一个环境(生产和开发)创建多个env_var。。使用这些变量,我可以遍历每个变量。Key键是环境名称。但是,我需要认识到如何迭代嵌套的值。我需要使用什么来代替loca
我正在尝试使用 Terraform 0.12+ 及其新的 for_each 在 Azure 中构建多个 vnet,但遇到了一些麻烦。我希望新功能能够让我创建一个接收复杂变量的通用网络模块,但我可能已经
在升级到更新的编译器并解决编译器错误时,我意识到 boost::fusion::for_each 要求传入的函数对象具有运算符 const。 示例来自 Boost : struct increment
我正在阅读 C++ Concurrency in Action 安东尼·威廉姆斯。在关于设计并发代码的章节中有并行版本的std::for_each。算法。这是本书中略微修改的代码: join_thre
我试图理解为什么在单线程上运行的 std::for_each 比 __gnu_parallel::for_each 快 ~3 倍在下面的示例中: Time =0.478101 milliseconds
我想在模块 block 中使用 count,但由于不支持它,我尝试使用 for 循环编写 for_each 但它给出了 “for_each”参数值不合适 错误。 我无法将计数传递给内部模块,因为它会弄
运行时terraform plan或 terraform apply提供给 for_each 的列表发生错误说 Error: Invalid for_each argument on main.t
我的问题是:如何将类成员函数传递给 for_each 我试图开始工作的代码:(在类外定义函数时有效) 失败的部分被注释掉了——使用for_each函数作为类成员函数的部分 关于如何让它工作有什么建议吗
我不太使用 STL,但我想开始学习它,所以我使用 STL 的 for_each 函数编写了一个非常简单的程序。这是整个程序(减去头文件): class Object { public: int
我现在正在学习 OpenCL,并且正在尝试编写一个“hello world”示例;我创建平台、设备和环境。 现在我想从设备获取设备信息,以便我创建信息并将其保存在 vector 中,然后打印它们。为此
我想弄清楚 for_each() 是如何使用的。首先,我改造了这个循环 for(int i = 0; i < myvector.size(); ++i){ myvector[i].a.b. =
我正在尝试使用 for_each 遍历字符串的每个字母, std::unordered_map dico; std::for_each(str.begin(),str.end(),[&](std::s
我想处理 2 个以某种方式相关的容器,并且我想处理它们之间的元素。 简单的例子:一个容器包含某种总和,另一个等长的容器包含必须从该总和中减去的数字。 std::vector s = {20,56,7,
我遇到了以下代码的问题: #include #include #include #include #include using namespace std; struct Person {
我试图让 myFunction 给我数组中值的总和,但我知道我不能使用返回值,当我用代码运行我的程序时,我得到的只是一个打印输出的值,没有总和,这是为什么? void myFunction (int
我正在尝试使用 STL 算法 (C++11) 重写我的一些代码,但我陷入了“无原始循环”规则。 我的一个函数中有这段代码: for (size_t i = 0; i size(); i++) {
有类和事件结构: struct Foo { Foo(): name("nx"), val(9) {} string name; int val; }; class Base {
我尝试将 for_each 与 boost::trim 一起使用。首先我用错了代码 std::for_each(v.begin(),v.end(),&boost::trim)); // error
我正在尝试函数式编程的一些功能,并尝试为 vector 中的每个对象调用一个成员函数。到目前为止,这是我的代码。 emplace.cc #include #include #include #i
我是一名优秀的程序员,十分优秀!