Возврат Итератора без метода Remove - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть несколько списков, и для конкретного списка (в списке примеров b) я должен вернуть итератор, у которого нет / разрешить метод удаления, я должен сохранить информацию:

 public static void main(String[] args){
    List<E> a = new ArrayList<E>;
    List<E> b = new ArrayList<E>;

    b.add("A");
    b.add("B");
    b.add("C");
    myMethod();
    }

    public Iterator<E> myMethod(){
      return b.iterator();
    }

Я не могу изменить "public Iterator myMethod ()", как можно вернуть итератор для b, без метода Remove?

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018
    return Collections.unmodifiableList(b).iterator();

Мне кажется, это самый простой выход.Неизменяемое представление в вашем списке гарантирует, что полученный итератор не сможет изменить список, то есть метод remove не будет работать и должен выдать исключение, UnsupportedOperationException.

EDIT: Поскольку вы не можете изменить myMethod, есть два варианта, или, на самом деле, варианты:

  1. Сделать b не изменяемым вообще.Конечно, это будет приемлемо, только если вам вообще не нужно вносить изменения в b.
  2. Сделать b неизменяемым представлением списка, которое можно изменить с помощью другого представлениятот же список.

Пример кода для 1., в Java 8 и более ранних версиях:

    List<String> b = Collections.unmodifiableList(Arrays.asList("A", "B", "C"));

В Java 9 и более поздних версиях проще:

    List<String> b = List.of("A", "B", "C");

List.of создает неизменяемый список.

В случае, если полностью неизменяемый список не соответствует вашим требованиям, вот предложение для кода для опции 2.:

    List<String> modifiableB = new ArrayList(Arrays.asList("A", "B", "C"));
    List<String> b = Collections.unmodifiableList(modifiableB);

Now myMethodполучит доступ к b, то есть к неизменяемому представлению, и, следовательно, создаст итератор, который не может удалить элементы, тогда как другие методы могут изменять от b до modifiableB.

0 голосов
/ 18 ноября 2018

Просто верните итератор неизменяемого списка, оборачивающего исходный список:

return Collections.unmodifiableList(b).iterator();
...