ArrayList частичная интеграция одного списка в другой
У меня есть функция, которая создает обычные объекты одного типа, и я не могу избежать этого шага. Когда я использую List.addAll(*), я получу много "Дубликатов", которые не равны в смысле объективности.
У меня очень плохо закодированное решение, и я хочу спросить, может ли быть лучшее или более эффективное решение, возможно, с функциями Java-Util и определением Comparator для этого единственного интермеццо?
Вот мой неприятный запах:
private void addPartial(List<SeMo_WikiArticle> allnewWiki, List<SeMo_WikiArticle> newWiki) {
if(allnewWiki.isEmpty())
allnewWiki.addAll(newWiki);
else{
for(SeMo_WikiArticle nn : newWiki){
boolean allreadyIn = false;
for(SeMo_WikiArticle oo : allnewWiki){
if(nn.getID()==oo.getID())
allreadyIn= true;
}
if(!allreadyIn)
allnewWiki.add(nn);
}
}
}
Есть идеи?
1 ответ
Добавить функцию переопределения equals()
в class SeMo_WikiArticle
:
class SeMo_WikiArticle {
// assuming this class has two properties below
int id;
String name;
SeMo_WikiArticle(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public boolean equals(Object obj) {
// implement your own comparison policy
// here is an example
if (obj instanceof SeMo_WikiArticle) {
SeMo_WikiArticle sw = (SeMo_WikiArticle)obj;
if (this.id == sw.id && (this.name == sw.name || this.name.equals(sw.name))) {
return true;
}
}
return false;
}
}
После этого вы можете использовать contains()
судить, если список уже содержит конкретный объект SeMo_WikiArticle
,
Вот код:
private void addPartial(List<SeMo_WikiArticle> allnewWiki, List<SeMo_WikiArticle> newWiki) {
for (SeMo_WikiArticle sw : newWiki) {
if (!allnewWiki.contains(sw)) {
allnewWiki.add(sw);
}
}
}