Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:我有一组自定义类。如何删除、修改和重新插入集合中的一个元素?_Java_Set - Fatal编程技术网

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