2013-04-14 2 views
1

Мне нужно перебрать все элементы ArrayList, кроме последнего. Поэтому я хочу создать такой итератор. Но мне не нужно реализовывать весь итератор, мне нужно переопределить только метод hasNext(), поэтому я хотел бы подкласса «стандартного» итератора. Есть ли способ сделать это?Могу ли я подкласса «стандартного» итератора араристов?

ответ

1

Было бы странно изменять итератор для выполнения этого обхода. Очевидная вещь, чтобы сделать, это написать «алгоритм», как вы хотите: (. Или использовать индекс в предположении RandomAccess списка)

public static <T> void eachExceptLast(List<? extends T> list, Operation<T> op) { 
    Iterator<T> iter = list.iterator(); 
    if (!iter.hasNext()) { 
     return; 
    } 
    T item = iter.next(); 
    while (iter.hasNext()) { 
     op.run(item); 
     item = iter.next(); 
    } 
} 

Однако, есть гораздо лучший способ сделать это. list.subList(0, list.size()-1) (для непустого списка) вернет представление исходного списка за меньшим, чем последний элемент. Он не делает копию, и вы даже можете использовать Iterator.remove.

0

Вы можете создать класс, который реализует интерфейсы Iterator или ListIterator, а затем переопределяет метод hasNext().

3

Я думаю, что лучший способ сделать это, а не переопределять итератор по умолчанию - это перебрать ArrayList по своему усмотрению. У ArrayList есть пара методов, которые могут помочь вам выполнить задачу: get(int) и size().
Все, что вам нужно сделать, это получить общее количество элементов в ArrayListsize()), а затем пропустить элементы, обращающиеся к каждому элементу непосредственно на каждой итерации, используя метод get(). Ваш код будет выглядеть примерно так:

for(int i = 0; i < myList.size() - 1; i++){ 
     element = myList.get(i); 
     //do something 
    } 

Теперь с этим принципом в виду, вы можете создать свой собственный класс итерировать ArrayList.

+0

+1 это намного проще –

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