Ich habe ein HashSet von benutzerdefinierten Objekten. Ich möchte ein Element aus dem Set entfernen, es modifizieren und es zurückstellen. Gibt es eine Möglichkeit, dies zu tun? Das Problem bei der Verwendung von Set.remove(Object o)
ist, dass das von mir entfernte Element nicht zurückgegeben wird. HierJava: Ich habe ein Set von benutzerdefinierten Klassen. Wie kann man ein Element des Sets entfernen, modifizieren und wieder einfügen?
ist ein Beispiel dafür, was ich versuche zu tun:
import java.util.HashSet;
import java.util.Set;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
public class Planet {
private String name;
private Set<String> moons = new HashSet<String>();
public void addMoon(String name) {
moons.add(name);
}
@Override
public boolean equals(Object obj)
{
if (obj == null) return false;
if (obj == this) return true;
if (obj.getClass() != getClass()) return false;
Planet rhs = (Planet) obj;
return new EqualsBuilder()
.append(getName(), rhs.getName())
.isEquals();
}
@Override
public int hashCode()
{
return new HashCodeBuilder(17,31).
append(getName())
.toHashCode();
}
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Set<String> getMoons() { return moons; }
}
Set<Planet> solarSystem = new HashSet<Planet>();
Planet addThisPlanet = new Planet();
addThisPlanet.setName("Jupiter");
addThisPlanet.addMoon("Titan");
if (solarSystem.contains(addThisPlanet)) {
Planet currentPlanet = // element of solarSystem that equals(addThisPlanet)
// remove currentPlanet from solarSystem
for(String moon: addThisPlanet.getMoons()) {
currentPlanet.addMoon(moon);
}
solarSystem.add(currentPlanet);
} else {
solarSystem.add(addThisPlanet);
}
Hier ist, was ich tue, ist das Hinzufügen von Monden eins nach dem anderen (wie sie „entdeckt“ werden), um bestehende (oder neu) Planeten. Wenn der Planet nicht bereits in der Menge ist, wird er mit seiner aktuellen Menge bekannter Monde hinzugefügt. Wenn der Planet bereits in der Menge ist, möchte ich ihn entfernen, die neu entdeckten Monde zu seinen bekannten Monden hinzufügen und dann den Planeten wieder zu der Menge hinzufügen.
Es scheint mir, dass eine 'Map' nützlicher wäre als ein' Set' für das, was Sie tun möchten. Sie können eine 'neue HashMap' haben, wobei der Map-Eintrag der Name des String-Planeten -> Planet-Objekts ist. Dann können Sie 'solarSystem.get (" Jupiter "). AddMoon (" Titan ")' erstellen, ohne ein Zwischenobjekt zu erstellen. –