在Java中向可迭代对象添加元素

5
我有以下代码:

public class Router {
  private Iterable<Route> routes;

  public Router(Iterable<Route> routes) {
    this.routes = routes;
  }
  public void addRoute(Route route) {
    routes.add(route);\\problem is here
  }
}

我已经突出显示了不起作用的那行。这里,我尝试将一个新对象添加到路由中。在主文件中,路由如下:

public class RouterMain 
{
    public static void main(String[] arg) throws IllegalArgumentException 
    {
        List<Route> routes = new ArrayList<Route>();
        Router router = new Router(routes);
    }
}

任务是在Router类的可迭代对象中添加一个对象。据我所知,Iterable可以进行迭代,但无法添加内容。那么我该怎么办?将Router类中的路由转换为List,添加一个元素,然后再转回去吗?

一个可迭代对象通常用于遍历集合,所以我不知道这是否可能,或者为什么你想要这样做。 - G_V
5个回答

7

Iterable<Router> 用于使得你的类中包含的 Router 元素可以被迭代。它并不是一个 Collection,尽管许多集合实现了这个接口。它没有 add 方法,只有一个返回 Iterator<Router> 的方法。

你应该使用一些 Collection(如 List、Set 等)来存储你的路由。这些集合都有 add 方法。

public class Router {
  private List<Route> routes = new ArrayList<Route>();

  public Router(Iterable<Route> routes) {
    for (Route route : routes)
      this.routes.add(route);
  }

}

我明白))) 但这是我的家庭作业。我的班级得到可迭代对象,我的任务是向其中添加一些内容。所以我需要将其转换为集合,然后再转回来吗? - ovod
@ovod 您可以遍历从输入Iterable中获取的Iterator。 然后,您可以将元素存储在任何Collection中。 - Eran
@ovod 请查看我的代码示例。您可以使用增强型for循环来迭代输入可迭代对象的元素。 - Eran

0

0

Iterable是一种在循环和实用函数中经常使用的类型 - 通常应该避免使用它。我建议将构造函数更改为Router(Collection<Route> routes)并在内部使用Collection接口。这样,您可以使用几乎任何集合类型(集合和列表)。

为了额外的安全性,复制集合 - 这样,您就不会受到其他人在代码之外更改集合的影响。


0
使用 List 接口代替 Iterable。它有一个方法 listIterator,返回一个 ListIterator 实例。在这个接口中,你可以添加和删除项目。而 Iterable 看起来并不适合你的任务。

0
如果你想要添加元素,你可以创建一个新的列表,并将所有当前元素添加到该列表中,然后在其后添加你想要的对象,例如:
public class Router {
  private Iterable<Route> routes;

  public Router(Iterable<Route> routes) {
    this.routes = routes;
  }
  public void addRoute(Route route) {

    //create new list
    ArrayList<Route> myList = new ArrayList<Route>();

    //iterate through current objects and add them to new list
    Iterator<Route> routeIterator = routes.iterator();
    while(routeIterator.hasNext()){
        myList.add(routeIterator.next());
    }


    //add object you would like to the list
    myList.add(route);

  }
}

然后你可以返回这个列表并对它进行任何你想做的操作。 - Mustafa J
1
@ovod 这段代码是错误的。while(routes.iterator().hasNext()) 会导致无限循环,因为每次调用 routes.iterator() 都会得到一个新的迭代器,而 routes.iterator().next() 总是返回迭代器返回的第一个 Route。 - Eran
修复: //创建迭代器 Iterator itr = routes.iterator();//遍历当前对象并将它们添加到新列表中 while(itr.hasNext()){ myList.add(itr.next()); } - Mustafa J

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接