Java:我有一组自定义类。如何删除、修改和重新插入集合中的一个元素?
我有一组自定义对象。我想从集合中删除一个元素,修改它,然后将其放回原处。有没有办法做到这一点?使用Java:我有一组自定义类。如何删除、修改和重新插入集合中的一个元素?,java,set,Java,Set,我有一组自定义对象。我想从集合中删除一个元素,修改它,然后将其放回原处。有没有办法做到这一点?使用Set.remove(objecto)的问题在于它不会返回我删除的元素 下面是我尝试做的一个例子: import java.util.HashSet; import java.util.Set; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCode
Set.remove(objecto)
的问题在于它不会返回我删除的元素
下面是我尝试做的一个例子:
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);
}
import java.util.HashSet;
导入java.util.Set;
导入org.apache.commons.lang3.builder.EqualsBuilder;
导入org.apache.commons.lang3.builder.HashCodeBuilder;
公共级行星{
私有字符串名称;
私有集moons=newhashset();
public void addMoon(字符串名称){
添加(名称);
}
@凌驾
公共布尔等于(对象obj)
{
if(obj==null)返回false;
如果(obj==this)返回true;
if(obj.getClass()!=getClass())返回false;
行星rhs=(行星)obj;
返回新的EqualBuilder()
.append(getName(),rhs.getName())
.isEquals();
}
@凌驾
公共int hashCode()
{
返回新的HashCodeBuilder(17,31)。
追加(getName())
.toHashCode();
}
公共字符串getName(){return name;}
public void setName(字符串名){this.name=name;}
公共集getMoons(){return moons;}
}
Set solarSystem=new HashSet();
行星addThisPlanet=新行星();
addThisPlanet.setName(“木星”);
addThisPlanet.addMoon(“泰坦”);
if(solarSystem.contains(addThisPlanet)){
Planet currentPlanet=//太阳系中等于(addThisPlanet)的元素
//从solarSystem中移除currentPlanet
for(字符串moon:addThisPlanet.getMoons()){
当前行星。添加月亮(月亮);
}
solarSystem.add(currentPlanet);
}否则{
添加(添加此星球);
}
在这里,我所做的是在现有(或新)行星上一个接一个地添加卫星(因为它们被“发现”)。如果这颗行星还不在这个集合中,它将被添加到它当前的已知卫星集合中。如果行星已经在集合中,我想删除它,将新发现的卫星添加到已知的卫星集合中,然后将行星添加回集合。您希望从集合中获得的对象是您已经拥有的对象,假设您在添加后未对其进行更改。
集合的contains
方法使用对象的equals
方法来确定它是否存在
有关包含的内容,请参见API文档:
您希望从集合中获取的对象是您已经拥有的对象,前提是您在添加该对象后未对其进行更改。集合的contains
方法使用对象的equals
方法来确定它是否存在
有关包含的内容,请参见API文档:
您无需将其移除并放回planet set。你可以这样做
if(solarSystem.contains(addThisPlanet)) {
for(Planet currentPlanet : solarSystem ){
if( currentPlanet.equals( addThisPlanet) )
{
for(String moon: addThisPlanet.getMoons())
{ currentPlanet .addMoon(moon); }
break;
}
}else { solarSystem.add(addThisPlanet); }
你不需要移除它,然后把它放回行星组。你可以这样做
if(solarSystem.contains(addThisPlanet)) {
for(Planet currentPlanet : solarSystem ){
if( currentPlanet.equals( addThisPlanet) )
{
for(String moon: addThisPlanet.getMoons())
{ currentPlanet .addMoon(moon); }
break;
}
}else { solarSystem.add(addThisPlanet); }
你可以通过使用地图
而不是集合
来解决这个问题——如果行星还没有出现,就在地图上添加行星;添加给定行星名称的卫星。
月亮本身保持不变,因此再次添加月亮的尝试不会复制它
我在想这样的事情
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);
}
}
公共级行星{
私有最终字符串名;
私有最终集moons=newhashset();
//注意,我在构造函数中设置了名称而不是setter
公共行星(字符串名称){
this.name=名称;
}
public void addMoon(字符串名称){
添加(名称);
}
@凌驾
公共布尔等于(对象obj){…与您的相同…}
@凌驾
public int hashCode(){…与您的相同…}
公共字符串getName(){return name;}
公共集getMoons(){return moons;}
}
// ... 在别处
最终映射solarSystem=新HashMap();
公共虚空添加卫星(最终字符串行星,最终字符串…卫星)
{
行星p=solarSystem.get(行星);
if(p==null){
p=新行星(行星);
//添加按名称映射的行星
put(p.getName(),p);
}
for(最终弦月:月亮){
p、 月亮;
}
}
你可以更进一步,让太阳系本身成为一个物体,而不是地图或集合。你可以通过使用地图
而不是集合
-将行星添加到地图中,如果它们不在那里;添加给定行星名称的卫星。
月亮本身保持不变,因此再次添加月亮的尝试不会复制它
我在想这样的事情
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);
}
}
公共级行星{
私有最终字符串名;
私有最终集moons=newhashset();
//注意,我在构造函数中设置了名称而不是setter
公共行星(字符串名称){
this.name=名称;
}
public void addMoon(字符串名称){
添加(名称);
}
@凌驾
公共布尔等于(对象obj){…与您的相同…}
@凌驾
public int hashCode(){…与您的相同…}
公共字符串getName(){return name;}
公共集getMoons(){return moons;}
}
// ... 在别处
最终映射solarSystem=新HashMap();
公共虚空添加卫星(最终字符串行星,最终字符串…卫星)
{
行星p=solarSystem.get(行星);
if(p==null){
p=新行星(行星);
//添加按名称映射的行星
put(p.getName(),p);
}
for(最终弦月:月亮){
p、 月亮;
}
}
您可以更进一步,将SolarSystem本身作为一个对象,而不是地图或集合。在我看来,地图
比集合
对您想要做的事情更有用。您可以有一个新的HashMap
,其中map条目是字符串planet name->planet object。然后你可以sol