Mam następujący HashMap o właściwościach kluczy i wartości:Java: porównanie HashMap <String, Object> Jeśli wartość może być Object []
private HashMap<String, Object> prop_values;
muszę sprawdzić, czy jedna instancja jest równa inny. W przeszłości, po prostu to zrobił:
if (prop_values_1.equals(prop_values_2)){
// do something
}
I to działało, dopóki mam Object[]
jako wartość. Tak więc moje poprzednie wyrażenie zawsze zwracało false
na takiej HashMap
z dowolną wartością Object[]
.
Więc mam do wdrożenia tej metody:
private boolean isPropValuesEquals(HashMap<String, Object> pv1, HashMap<String, Object> pv2){
boolean isEquals = true;
if (pv1 == null || pv2 == null){
return false;
}
if (!pv1.keySet().equals(pv2.keySet())){
return false;
}
for (String key : pv1.keySet()){
Object cur_pv1 = pv1.get(key);
Object cur_pv2 = pv2.get(key);
if (cur_pv1 instanceof Object[]){
if (cur_pv2 instanceof Object[]){
isEquals = Arrays.equals((Object[])cur_pv1, (Object[])cur_pv2);
} else {
return false;
}
} else {
isEquals = isEquals && cur_pv1.equals(cur_pv2);
}
if (!isEquals){
return false;
}
}
return isEquals;
}
to działa, ale wydaje się być pewnego rodzaju włamania, i nie jestem pewien, że to najlepszy sposób, aby osiągnąć to, czego potrzebuję.
Tak więc, oto dwa pytania.
dlaczego Object [] equals() nie jest taka sama jak Arrays.equals()? To wydaje się być bolesne.
Czy jest jakiś lepszy sposób na porównanie
HashMap<String, Object>
, jeśli wartościami mogą byćObject[]
?
Użyj Listy
@JBNizet, istnieje inny rodzaj bólu z ostrzeżeniem o bezpieczeństwie typu podczas rzutowania z 'obiektu' na typ sparametryzowany, taki jak' List
Masz ostrzeżenia, ale nie jest to mniej bezpieczne niż rzutowanie na obiekt []. Po prostu obuduj wszystko poprawnie i upewnij się, że masz solidny kod. –