如何修改Java中Iterable <t>中的每个元素?

时间:2016-11-11 00:16:44

标签: java iterator iterable

我尽可能地搜索并且我正在努力寻找这个问题的答案。我有一个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;
     }
}

1 个答案:

答案 0 :(得分:0)

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

for (T e : list)

这将为变量e分配一个对列表中某个对象的引用的副本

您尝试为e分配新值:

e = a.get(index);

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

你的最终目标是返回一个反向传播的迭代?你有几个选择。

  • 保持基础列表不变,但创建自定义迭代器以提供反向视图。这个迭代器可以提供你返回的Iterable<T>
  • 对基础列表的内容进行随机播放,以使列表本身的顺序相反(您可以使用Collections.reverse(list))。它的自然迭代顺序类似于&#34;反向&#34;迭代原始列表。
  • 与上述相同,但不是改变现有列表:创建列表的反向副本

你做的一件事就是让自己变得更难:

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

这个是否需要接受Iterable特有的内容?它是否可以接受List(使您能够在任何索引处查找元素)?如果 Iterable,您可能不必存储为Iterable。您可以将其内容插入ArrayList,然后您的变量list实际上可能是List