HashSet.remove () и Iterator.remove () не работа

Обратите внимание, что тест -d может привести к неожиданным результатам:

$ ln -s tmp/ t
$ if [ -d t ]; then rmdir t; fi
rmdir: directory "t": Path component not a directory

Файл под: «Когда каталог не является каталогом?» Ответ: «Когда это символическая ссылка на каталог». Немного более тщательный тест:

if [ -d t ]; then 
   if [ -L t ]; then 
      rm t
   else 
      rmdir t
   fi
fi

Более подробную информацию вы можете найти в руководстве Bash в условных выражениях Bash и встроенной команде [ и [[ соединение commmand .

34
задан Will Glass 27 February 2009 в 04:17
поделиться

8 ответов

Я был очень любопытен на предмет этого все еще и записал следующий тест:

import java.util.HashSet;
import java.util.Iterator;
import java.util.Random;
import java.util.Set;

public class HashCodeTest {
    private int hashCode = 0;

    @Override public int hashCode() {
        return hashCode ++;
    }

    public static void main(String[] args) {
        Set<HashCodeTest> set = new HashSet<HashCodeTest>();

        set.add(new HashCodeTest());
        System.out.println(set.size());
        for (Iterator<HashCodeTest> iter = set.iterator();
                iter.hasNext();) {
            iter.next();
            iter.remove();
        }
        System.out.println(set.size());
    }
}

, который приводит к:

1
1

, Если хэш-код () значение объекта изменилось, так как это было добавлено к HashSet, это, кажется, представляет несъемный объект.

я не уверен, является ли это проблемой, Вы сталкиваетесь, но это - что-то, чтобы изучить, если Вы решаете пересмотреть это.

47
ответ дан 27 November 2019 в 16:55
поделиться

Под покрытиями HashSet использует HashMap, который называет HashMap.removeEntryForKey (Объект), когда или HashSet.remove (Объект) или Iterator.remove () называют. Этот метод использует оба хэш-кода () и равняется () для проверки этого, это удаляет надлежащий объект из набора.

, Если оба Iterator.remove () и HashSet.remove (Объект) не работают, то что-то определенно неправильно с Вашим, равняется () или хэш-код () методы. Регистрация кода для них была бы полезна в диагнозе Вашей проблемы.

6
ответ дан 27 November 2019 в 16:55
поделиться

Действительно ли Вы абсолютно уверены, что DataResult неизменен? Каков тип метки времени? Если это java.util.Date, Вы делаете копии из него при инициализации DataResult? Следует иметь в виду, что java.util.Date изменяемо.

, Например:

Date timestamp = new Date();
DataResult d = new DataResult(timestamp);
System.out.println(d.getTimestamp());
timestamp.setTime(System.currentTimeMillis());
System.out.println(d.getTimestamp());

распечатал бы два различных раза.

также помогло бы, могли ли Вы отправить некоторый исходный код.

2
ответ дан 27 November 2019 в 16:55
поделиться

Спасибо за всю справку. Я подозреваю, что проблема должна быть с, равняется () и хэш-код (), как предложено spencerk. Я действительно проверял тех в свой отладчик и с модульными тестами, но я должен пропускать что-то.

я закончил тем, что делал обходное решение - копирование всех объектов кроме одного к новому Набору. Для ударов я использовал Apache палата общин CollectionUtils.

    Set<DataResult> tempResults = new HashSet<DataResult>();
    CollectionUtils.select(allResults, 
            new Predicate()
            {
                public boolean evaluate(Object oldData)
                {
                    return !data.equalsData((DataResult) oldData);
                }
            }
            , tempResults);
    allResults = tempResults;

я собираюсь остановиться здесь - слишком много работы для упрощения вниз до простого тестового сценария. Но справка является ценившим miuch.

2
ответ дан 27 November 2019 в 16:55
поделиться

Вы попробовали что-то как

boolean removed = allResults.remove(oldData)
if (!removed) // COMPLAIN BITTERLY!

, Другими словами, удаляете объект из Набора и повреждаете цикл. Это не заставит Iterator жаловаться. Я не думаю, что это - долгосрочное решение, но вероятно дало бы Вам некоторую информацию о hashCode, equals и equalsData методы

1
ответ дан 27 November 2019 в 16:55
поделиться

Почти наверняка имеет место, что хэш-коды не соответствуют для старых и новых данных, которые являются, "равняется ()". Я столкнулся с такого рода вещью прежде, и Вы по существу заканчиваете тем, что извергли хэш-коды для каждого объекта и строкового представления и пытались выяснить, почему несоответствие происходит.

при сравнении объектов пред/сообщение база данных, иногда она теряет наносекунды (в зависимости от типа столбца DB), который может заставить хэш-коды изменяться.

1
ответ дан 27 November 2019 в 16:55
поделиться

Если существует две записи с теми же данными, только один из них заменяется..., Вы объяснили это? И на всякий случай, Вы попробовали другую структуру данных набора, которая не использует хэш-код, говорит Список?

-2
ответ дан 27 November 2019 в 16:55
поделиться

Я не до скорости на моем Java, но я знаю, что Вы не можете удалить объект из набора, когда Вы выполняете итерации по тому набору в.NET, хотя.NET выдаст исключение, если это поймает это. Это могло быть проблемой?

-4
ответ дан 27 November 2019 в 16:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: