gpt4 book ai didi

Java:我有一组自定义类。如何删除、修改和重新插入 Set 中的一个元素?

转载 作者:行者123 更新时间:2023-12-02 03:35:47 33 4
gpt4 key购买 nike

我有一个自定义对象的哈希集。我想从集合中删除一个元素,修改它,然后将其放回去。有什么办法可以做到这一点吗?使用 Set.remove(Object o) 的问题是它不会返回我已删除的元素。

这是我正在尝试做的事情的示例:

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);
}

这里我正在做的是将卫星一颗一颗(因为它们是“发现”的)添加到现有(或新)行星中。如果该行星尚未包含在该集合中,则会将其添加到当前已知的卫星集合中。如果行星已经在集合中,我想将其删除,将新发现的卫星添加到其已知卫星集中,然后将行星添加回集合中。

最佳答案

您可以通过使用Map而不是Set来解决这个问题 - 如果行星不存在,请将它们添加到 map 中;添加给定行星名称的卫星。卫星本身保持一个集合,因此尝试再次添加卫星不会重复它。

我正在思考一些类似的事情......

public class Planet {
private final String name;
private final Set<String> moons = new HashSet<String>();

// notice I set the name in the Constructor instead of a setter
public Planet(String name) {
this.name = name;
}

public void addMoon(String name) {
moons.add(name);
}

@Override
public boolean equals(Object obj) { ...same as yours... }

@Override
public int hashCode() { ...same as yours... }

public String getName() { return name; }

public Set<String> getMoons() { return moons; }
}


// ... elsewhere ...

final Map<String,Planet> solarSystem = new HashMap<>();

public void addMoons(final String planet, final String... moons)
{
Planet p = solarSystem.get(planet);
if (p == null) {
p = new Planet(planet);
// add the Planet mapped by its name
solarSystem.put(p.getName(), p);
}
for (final String moon : moons) {
p.addMoon(moon);
}
}

您可以更进一步,使 SolarSystem 本身成为一个对象,而不是 map 或集合。

关于Java:我有一组自定义类。如何删除、修改和重新插入 Set 中的一个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37449648/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com