Обратите внимание, что тест -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 .
Я был очень любопытен на предмет этого все еще и записал следующий тест:
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, это, кажется, представляет несъемный объект.
я не уверен, является ли это проблемой, Вы сталкиваетесь, но это - что-то, чтобы изучить, если Вы решаете пересмотреть это.
Под покрытиями HashSet использует HashMap, который называет HashMap.removeEntryForKey (Объект), когда или HashSet.remove (Объект) или Iterator.remove () называют. Этот метод использует оба хэш-кода () и равняется () для проверки этого, это удаляет надлежащий объект из набора.
, Если оба Iterator.remove () и HashSet.remove (Объект) не работают, то что-то определенно неправильно с Вашим, равняется () или хэш-код () методы. Регистрация кода для них была бы полезна в диагнозе Вашей проблемы.
Действительно ли Вы абсолютно уверены, что 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());
распечатал бы два различных раза.
также помогло бы, могли ли Вы отправить некоторый исходный код.
Спасибо за всю справку. Я подозреваю, что проблема должна быть с, равняется () и хэш-код (), как предложено 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.
Вы попробовали что-то как
boolean removed = allResults.remove(oldData)
if (!removed) // COMPLAIN BITTERLY!
, Другими словами, удаляете объект из Набора и повреждаете цикл. Это не заставит Iterator
жаловаться. Я не думаю, что это - долгосрочное решение, но вероятно дало бы Вам некоторую информацию о hashCode
, equals
и equalsData
методы
Почти наверняка имеет место, что хэш-коды не соответствуют для старых и новых данных, которые являются, "равняется ()". Я столкнулся с такого рода вещью прежде, и Вы по существу заканчиваете тем, что извергли хэш-коды для каждого объекта и строкового представления и пытались выяснить, почему несоответствие происходит.
при сравнении объектов пред/сообщение база данных, иногда она теряет наносекунды (в зависимости от типа столбца DB), который может заставить хэш-коды изменяться.
Если существует две записи с теми же данными, только один из них заменяется..., Вы объяснили это? И на всякий случай, Вы попробовали другую структуру данных набора, которая не использует хэш-код, говорит Список?
Я не до скорости на моем Java, но я знаю, что Вы не можете удалить объект из набора, когда Вы выполняете итерации по тому набору в.NET, хотя.NET выдаст исключение, если это поймает это. Это могло быть проблемой?