2014-12-30 3 views
1

Я получаю исключение при попытке удалить элемент из:EMF и гуава Eclipse, Java

`org.eclipse.emf.common.util.EList<E> using guava Iterables.removeIf...` 

за исключением:

java.lang.IllegalArgumentException: ограничение 'без повторяющегося ключевых слов' нарушается
на org.eclipse.emf.common.util.AbstractEList.set (AbstractEList.java:262)
в com.google.common.collect.Iterables.removeIfFromRandomAccessList (Iterables.java:198)
на com.google.common.collect.Iterables.removeIf (Iterables.java:180)
в com.mypackage.MyClass $ 5.applyChanges (MyClass.java:325)

код, который давая исключение:

Iterables.removeIf(EListObj, new Predicate<Variant>() 
     { 
     @Override 
     public boolean apply(final Varen varen) 
     { 
      return varen.getName().equals(varenToDelete.getName()); // varenToDelete declared above in method 
     } 
     }); 

ответ

2

вы не сказали нам, что вы, очевидно, с помощью UniqueEList, который действительно не позволяет повторяющихся записей. Однако из контекста это очевидно.

Поскольку Guava является открытым исходным кодом, вы можете посмотреть на код и посмотреть, что там происходит.

Если вы посмотрите на реализацию метода removeIf() или, более конкретно, на метод removeIfFromRandomAccessList(), вы увидите, что алгоритм удаления действительно вводит в список непродолжительные дубликаты. Вот как это работает:

  1. Он выполняет итерацию списка, поддерживая два указателя. Один для чтения from и один для записи to списка, названного соответствующим образом. from будет двигаться вперед, а to, как правило, не дойдет до конца списка.
  2. Когда элемент не соответствует вашему предикату (его не следует удалять), он вместо этого копируется из индекса from (его исходная позиция в списке) в позицию to (позиция в отфильтрованном списке).
  3. Повторите для всех предметов.
  4. В конце концов, отрежьте предметы, которые не были написаны, что делает список короче и содержит только те предметы, которые мы хотим.

Теперь эта реализация просто не работает ни для какого вида UniqueList. I found an existing Guava bug on that issue, #1596. Не стесняйтесь прокомментировать это/проголосовать за него, если это все еще возможно.

В качестве обходного пути используйте Iterables.filter(), который не страдает от таких ограничений. Имейте в виду, он тоже ленив, поэтому он работает по-другому. Если вы не делаете что-то напуганное со своим списком, все должно быть хорошо.


EDIT 2015/11: Это только фиксировался в гуавы 20 (который не выходит пока).

+0

(И, пожалуйста, в будущем всегда старайтесь искать известные ошибки/проблемы с библиотеками с открытым исходным кодом, такие как Guava. Именно поэтому у них есть открытый трекер.) –

+0

Привет, Спасибо за ответ, как вы обсуждали, чтобы найти известные ошибки, поэтому у меня есть некоторые запросы. -> Я хочу знать, как искать известные ошибки/проблемы, -> что такое открытый трекер. Не могли бы вы помочь в этом отношении? –

+0

Ну, проблема в Guava, поэтому давайте посмотрим страницу Guava: https://github.com/google/guava. Нажмите «Проблемы»: https://github.com/google/guava/issues, найдите все, что вас интересует. В этом конкретном случае я попробовал «removeif» и voilá! –

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