【问题标题】:How do I modify each element in an Iterable<T> in Java? [duplicate]如何在 Java 中修改 Iterable<T> 中的每个元素? [复制]
【发布时间】:2017-03-25 04:04:35
【问题描述】:

我已尽我所能搜索,我正在努力寻找这个问题的答案。我有一个 Iterable 对象,我想修改其中的每个项目(我不想添加到它) 具有新值。我试过了

for (T e : list) 
{
    e = a.get(index);
    System.out.println(e);
    index--;
}

修改它,但这显然不起作用,因为它是一个 foreach 循环。有人可以告诉我这段代码我做错了什么吗? (这个想法是我试图颠倒我的 Iterable 的项目顺序。)

public class LinkedList<T>
{
     Iterable<T> list;
     public LinkedList() {} //create an empty list
     public LinkedList(Iterable<T> iterable)
     {
         list = iterable;
     }
     @SuppressWarnings("unchecked")
     public Iterable<T> reverse()
     {
         Integer size = size();
         List<T> a = new ArrayList<T>();
         Integer index = size - 1;
         for (T e : list) 
         {
             a.add(e);
         }
         Iterator iterator = list.iterator();
         while (iterator.hasNext()) 
         {
             T element = (T)iterator.next();
             element = a.get(index);
             System.out.println(element);
             index--;
         }
         return list;
     }
}

【问题讨论】:

  • 如你希望迭代完成后有不同的元素?不可能。 Iterables 不是这样工作的。
  • 我只想反转Iterable中的元素。那可能吗? @user2357112
  • 你可以返回一个“反向迭代器”,但你的代码都没有修改任何东西......这也不是你使用 foreach 循环的事实
  • 那么,我该怎么做才能真正修改 Iterable? @cricket_007
  • 您不能修改 Iterable 的元素。想象一下,如果可以的话。例如,一个 Iterable 可以在您从网络套接字读取的文本行上。那么你将如何修改它们以扭转它们?答案是你不能。您只能反转 List、数组或任何具有基于索引的 get 和 set 的东西。

标签: java iterator iterable


【解决方案1】:

你需要了解这个循环结构:

for (T e : list)

这将分配给变量e,这是对列表中某个对象的引用的副本

您尝试为e 分配一个新值:

e = a.get(index);

但所有这些实现都是覆盖您的副本参考。列表list 继续使用它一直使用的引用。


您的最终目标是返回一个反向传播的可迭代对象?这里有几个选项。

  • 保持底层列表不变,但制作一个 custom 迭代器以提供反向视图。这个迭代器可以提供一个Iterable&lt;T&gt;,你可以返回它。
  • 围绕底层列表的内容打乱,使得 列表本身 是相反的顺序(您可以为此使用Collections.reverse(list))。它的自然迭代顺序类似于原始列表的“反向”迭代。
  • 与上述相同,但不是改变现有列表:创建列表的反向副本

你正在做的一件事会让你自己很难做到这一点:

Iterable<T> list;
public LinkedList(Iterable<T> iterable) {
    list = iterable;
}

需要接受像Iterable这样具体的东西吗?它是否可以改为接受List(让您能够在任何索引处查找元素)?如果它必须Iterable,您可能不必存储它作为一个Iterable。您可以将其内容插入ArrayList,然后您的变量list 实际上可能是List

【讨论】:

  • 重点是e 是一个不同的变量。自动复制引用的事实。
猜你喜欢
  • 2014-08-04
  • 2023-02-15
  • 1970-01-01
  • 2020-03-25
  • 1970-01-01
  • 1970-01-01
  • 2022-10-14
  • 2011-08-22
  • 1970-01-01
相关资源
最近更新 更多