Как сравнить и удалить объекты из набора <E>на основе условия - PullRequest
0 голосов
/ 17 сентября 2009

У меня есть набор именованных скриптов. У класса E есть такие элементы, как id, последовательность и многое другое. Я хочу сравнить две строки объекта E в сценариях и удалить только если id и последовательность совпадают. Как мне это сделать. У меня есть код, который удаляет все строки. Может ли кто-нибудь исправить этот код, чтобы удалить только те, которые имеют одинаковый идентификатор и последовательность.

        LinkedList<EditorScriptRow> lList = new LinkedList<EditorScriptRow>       (_scriptRows);

     for (ListIterator<EditorScriptRow> i = lList.listIterator(); i.hasNext();) {
           EditorScriptRow row = i.next();
         int k =0;
        for (ListIterator<EditorScriptRow> j = lList.listIterator(k+1) j.hasNext();) {

           EditorScriptRow row1 = j.next();

            if ((row.getTemplateRow().getId() != null) && 
               (row.getSequence() != null) && 
                (row.getEdit().getName() != null) ) {
                if ((row.getSequence().equals(row1.getSequence())) &&
                    (row.getTemplateRow().getId().equals(row1.getTemplateRow  ().getId      ())) && 
                    (row.getEdit().getName().equals(row1.getEdit().getName()))) {
                        _scriptRows.remove(row);
                }
        }
    }
k++;
}

Ответы [ 4 ]

2 голосов
/ 17 сентября 2009

Вы упомянули «Set», но ваш код использует LinkedList. Какой это?

У вас есть доступ к исходному коду для класса EditorScriptRow?

Если вы это сделаете, вы можете переопределить метод equals. Контракт для интерфейса Set заключается в том, что он не может содержать два объекта, которые считаются равными методом «равно». Таким образом, вы можете использовать реализацию Set (например, HashSet), и таким образом вы можете просто добавить объект в Set, и у вас гарантированно не будет дубликатов.

1 голос
/ 17 сентября 2009

Я бы составил список id + sequence и проверил бы это. Я только что написал это, так что может потребоваться доработка, но что-то вроде

Set idSequence = new HashSet();
for ( Iterator iterator = list.iterator(); iterator.hasNext(); )
{
  EditorScriptRow row = (EditorScriptRow) iterator.next();
  if ( ( row.getTemplateRow().getId() != null )
    && ( row.getSequence() != null )
    && ( row.getEdit().getName() != null ) )
  {
    String idAndSequence = row.getTemplateRow().getId() + row.getSequence();
    if ( idSequence.contains( idAndSequence ) )
    {
      iterator.remove();
    }
    else
    {
      idSequence.add( idAndSequence );
    }
  }
}
0 голосов
/ 17 сентября 2009

переопределить равно в EditorScriptRow

@Override
public boolean equals(Object o) {
    if (o instanceof EditorScriptRow) {
        EditorScriptRow other = (EditorScriptRow) o;
        return this.id.equals(other.id) && this.sequence.equals(other.sequence);
    }
    return false;
}

Затем создайте набор вместо связанного списка.

Set<EditorScriptRow> set = new HashSet<EditorScriptRow>();

Когда вы добавляете объекты EditorScriptRow в набор, дубликаты будут игнорироваться, потому что вы переопределили равные таким образом

Вы можете просмотреть некоторые учебники по Java-коллекциям, если это не имеет смысла http://java.sun.com/docs/books/tutorial/collections/index.html

0 голосов
/ 17 сентября 2009

Вы можете использовать remove () на итераторе, чтобы удалить последний элемент, возвращаемый функцией next ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...