2014-12-09 5 views
2

У меня есть следующий код:добавить элемент итератора в Java

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, добавить элемент и вернуться?

+0

итератор, как правило, используется для ходьбы через коллекцию, поэтому я не знаю, возможно ли это или почему вы хотите. –

ответ

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); 

    } 
} 
+0

Тогда вы можете вернуть список и сделать все, что вам нравится с ним. –

+1

@ovod Этот код является неправильным. 'while (routes.iterator(). hasNext())' вызовет бесконечный цикл, так как каждый раз, когда вы вызываете route.iterator(), вы получаете новый Iterator и 'routes.iterator(). next()' будет всегда возвращайте первый маршрут, возвращаемый Iterator. – Eran

+0

Исправить: // создать итератор Итератор itr = маршруты.итератора(); // итерация по текущим объектам и их добавление в новый список while (itr.hasNext()) { myList.add (itr.next()); } –

5

Iterable<Router> используется для включения итерации над элементами Router, содержащимися в вашем классе. Это не коллекция, хотя многие коллекции реализуют этот интерфейс. Он не имеет метода add. Он имеет только метод, который возвращает Iterator<Router>.

Чтобы сохранить маршруты, вы должны использовать некоторые коллекции (список, набор и т. Д.). Эти коллекции имеют метод add.

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

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

} 
+0

Я не знаю, это))) Но это мой hometask. Мой класс получает итеративный объект, и моя задача - добавить что-то к нему. Так что мне нужно преобразовать его в коллекцию и снова вернуться? – ovod

+0

@ovod Вы можете перебирать итератор, который вы можете получить из ввода Iterable. Затем вы можете сохранить элементы в любой коллекции. – Eran

+0

@ovod Смотрите мой пример кода. Вы можете использовать расширенный цикл for для итерации по элементам входного итерабельного. – Eran

0

Iterable является тип, который в основном используется в циклах и полезных функций - вы должны избегать его в целом. Я предлагаю изменить конструктор на Router(Collection<Route> routes) и использовать интерфейс Collection внутри. Таким образом, вы можете использовать почти любой тип коллекции (наборы и списки).

Для дополнительной безопасности создайте копию коллекции - тогда вы не можете пострадать от того, кто внесет изменения в коллекцию вне вашего кода.

0

Использовать интерфейс List вместо Iterable. Он имеет метод listIterator. Что возвращает экземпляр ListIterator. В этом интерфейсе вы можете добавлять и удалять элементы. Iterable не подходит для вашей задачи.

Смежные вопросы