Существует различие, да.
XML, который придерживается стандарт XML , считают хорошо сформированным, в то время как xml, который придерживается DTD, считают допустимым.
Класс, который предложил Дэвид Хедлунд, можно сделать намного короче:
public class UniqueArrayList extends ArrayList {
/**
* Only add the object if there is not
* another copy of it in the list
*/
public boolean add(T obj) {
if(this.contains(obj))
return false;
return super.add(obj);
}
public boolean addAll(Collection c) {
boolean result = false;
for (T t : c) {
if (add(t)) {
result = true;
}
}
return result;
}
}
Операция addAll
также изменена. В документации указано:
Возвращает: истина, если этот список изменился в результате вызова.
Я изменил метод, чтобы отразить это поведение. Есть еще одна проблема. В документации метода addAll () также говорится:
Добавляет все элементы в указанной коллекции в конец этого списка в том порядке, в котором они возвращаются итератором указанной коллекции.
Порядок может быть следующим. сломаны с помощью этого метода. Возможное решение этой проблемы может заключаться в отсутствии поддержки метода addAll
.
Я думаю, что настоящее изящное решение для принудительного применения списков уникальных массивов - это этот , если это не слишком много кода для того, чего вы пытаетесь достичь.
public class UniqueOverridingList extends ArrayList {
public enum LAST_RESULT {
ADD, OVERRIDE, NOTHING;
}
private LAST_RESULT lastResult;
public boolean add(T obj) {
for (int i = 0; i < size(); i++) {
if (obj.equals(get(i))) {
set(i, obj);
lastResult = LAST_RESULT.OVERRIDE;
return true;
}
}
boolean b = super.add(obj);
if (b) {
lastResult = LAST_RESULT.ADD;
} else {
lastResult = LAST_RESULT.NOTHING;
}
return b;
}
public boolean addAll(Collection c) {
boolean result = true;
for (T t : c) {
if (!add(t)) {
result = false;
}
}
return result;
}
public LAST_RESULT getLastResult() {
return lastResult;
}
}