Java 如果对象位于ArrayList中,如何更改它?

Java 如果对象位于ArrayList中,如何更改它?,java,arraylist,equals,Java,Arraylist,Equals,我有一个狗的列表。如果Fluffy在ArrayList中,我想将其名称更改为Fido。如果它不在ArrayList中,我想添加它,然后将其名称更改为Fido 因此,我可以检查ArrayList中是否存在Fido,但如何检索它以便进行更改?以下是我最近的一次。我正在寻找类似于狗的东西 import java.util.ArrayList; 公家犬{ 公共静态void main(字符串[]args){ ArrayList dogs=新的ArrayList(); 添加(新狗(“Fido”); 狗=新狗

我有一个狗的列表。如果Fluffy在ArrayList中,我想将其名称更改为Fido。如果它不在ArrayList中,我想添加它,然后将其名称更改为Fido

因此,我可以检查ArrayList中是否存在Fido,但如何检索它以便进行更改?以下是我最近的一次。我正在寻找类似于狗的东西

import java.util.ArrayList;
公家犬{
公共静态void main(字符串[]args){
ArrayList dogs=新的ArrayList();
添加(新狗(“Fido”);
狗=新狗(“Fido”);
if(狗。包含(狗)){
dog.name=“Fluffy”;
}
System.out.println(dogs.get(0.name);//打印Fido
}
字符串名;
公共狗(字符串名称){
this.name=名称;
}
@凌驾
公共布尔等于(对象o){
如果(this==o)返回true;
如果(!(o狗的实例))返回false;
狗=(狗)o;
return!(name!=null?!name.equals(dog.name):dog.name!=null);
}
@凌驾
公共int hashCode(){
返回名称!=null?name.hashCode():0;
}
}
编辑:

我尝试将我的主要方法更改为此,但不起作用:

ArrayList<Dog> dogs = new ArrayList<>();
dogs.add(new Dog("Fido"));
Dog dog = new Dog("Fido");
if (dogs.contains(dog)) {
    dogs.get(dogs.indexOf(dog)).name = "Fluffy";
}
System.out.println(dogs.get(0).name);
ArrayList dogs=new ArrayList();
添加(新狗(“Fido”);
狗=新狗(“Fido”);
if(狗。包含(狗)){
dogs.get(dogs.indexOf(dog)).name=“Fluffy”;
}
System.out.println(dogs.get(0.name));
您可以使用以下方法获取Fido的(第一个)索引:

int indexOfFido = dogs.indexOf(new Dog("Fido"));
然后使用以下命令检索元素:

dogs.get(indexOfFido);
但是,根据您正在使用的
List
的具体实现,迭代列表可能更有效:

Dog fido = new Dog("Fido");
for (Dog dog : dogs) {
  if (fido.equals(dog)) {  // Do the comparison this way round, since
                           // elements of list can be null in general.
    // Do whatever.
    break;  // Unless you want to do the same to all instances of Fido.
  }
}
我不完全确定Dog对象在内部是如何工作的,我的答案是基于Dog类是这样的想法:

public static String name;
public Dog(String name) {
    this.name = name;
}
if(dogs.contains(dog))
的计算结果为true,但您正在修改局部变量
dog
,而不是
ArrayList中的
dog
对象

改变

dog.name = "Fluffy";

你会得到你想要的结果

public static void main(String[] args) throws Exception {
    ArrayList<Dog> dogs = new ArrayList<>();
    dogs.add(new Dog("Fido"));
    Dog dog = new Dog("Fido");
    if (dogs.contains(dog)) {
        dogs.get(dogs.indexOf(dog)).name = "Fluffy";
    } else {
        dogs.add(dog);
    }

    System.out.println(dogs.get(0).name); //prints Fido
}
publicstaticvoidmain(字符串[]args)引发异常{
ArrayList dogs=新的ArrayList();
添加(新狗(“Fido”);
狗=新狗(“Fido”);
if(狗。包含(狗)){
dogs.get(dogs.indexOf(dog)).name=“Fluffy”;
}否则{
狗。添加(狗);
}
System.out.println(dogs.get(0.name);//打印Fido
}

如果您使用的是Java 8,您可以在
列表
流中使用
过滤器
,然后依次使用
findAny
ifPresent

下面是一个简单的例子:

public static void main(String[] args) {
    List<Thing> things = new ArrayList<>();
    things.add(new Thing("thing one"));
    things.add(new Thing("thing two"));
    System.out.println(things);
    things.stream().filter(t -> t.toString()
            .contains("one"))
            .findFirst()
            .ifPresent(t -> t.setName("three"));
    System.out.println(things);
}

public static class Thing{
    private String name;
    public Thing(String s){name=s;}
    public String toString(){return "Thing{name="+name+"}";}
    public void setName(String s){ name = s;}
    public int hashcode(){return name.hashCode();}
    public boolean equals(Object o){
        return o != null && this.toString().equals(o.toString());
    }
}
publicstaticvoidmain(字符串[]args){
List things=new ArrayList();
添加(新事物(“事物一”);
添加(新事物(“事物二”);
系统输出打印(事物);
things.stream().filter(t->t.toString())
.包含(“一”))
.findFirst()
.ifPresent(t->t.setName(“三”);
系统输出打印(事物);
}
公共静态类事物{
私有字符串名称;
公共事物(字符串s){name=s;}
公共字符串toString(){return“Thing{name=“+name+”}”;}
public void setName(字符串s){name=s;}
public int hashcode(){return name.hashcode();}
公共布尔等于(对象o){
返回o!=null&&this.toString().equals(o.toString());
}
}
以及输出

[Thing{name=thing one}, Thing{name=thing two}] [Thing{name=three}, Thing{name=thing two}] [事物{name=事物一},事物{name=事物二}] [事物{name=Thing},事物{name=Thing two}]
请注意,第一个元素已更改。

该代码的作用是什么?显示输出。只需循环元素并检查每个元素(或直到第一个元素)。@SotiriosDelimanolis darn。行。我希望有一种更漂亮的方式,但那会奏效的。谢谢您可以使用所需的任何查找(例如,按名称)将元素保留在并行映射中。每个集合都提供一个方法
contains
,列表还为重载
等于
的对象提供
indexOf
,我将主方法更改为此,但它不起作用:ArrayList dogs=new ArrayList();添加(新狗(“Fido”);狗=新狗(“Fido”);if(dogs.contains(dog)){dogs.get(dogs.indexOf(dog)).name=“Fluffy”}System.out.println(dogs.get(0.name));此外,不需要单独调用
contains
indexOf
indexOf
如果找不到元素,则返回-1。你基本上扫描了列表两次。它是由我的IDE自动生成的。它为我打印“Fluffy”。这很奇怪……我重新编辑了构建,它成功了。我想IntelliJ可能是骗了我。谢谢
public static void main(String[] args) throws Exception {
    ArrayList<Dog> dogs = new ArrayList<>();
    dogs.add(new Dog("Fido"));
    Dog dog = new Dog("Fido");
    if (dogs.contains(dog)) {
        dogs.get(dogs.indexOf(dog)).name = "Fluffy";
    } else {
        dogs.add(dog);
    }

    System.out.println(dogs.get(0).name); //prints Fido
}
public static void main(String[] args) {
    List<Thing> things = new ArrayList<>();
    things.add(new Thing("thing one"));
    things.add(new Thing("thing two"));
    System.out.println(things);
    things.stream().filter(t -> t.toString()
            .contains("one"))
            .findFirst()
            .ifPresent(t -> t.setName("three"));
    System.out.println(things);
}

public static class Thing{
    private String name;
    public Thing(String s){name=s;}
    public String toString(){return "Thing{name="+name+"}";}
    public void setName(String s){ name = s;}
    public int hashcode(){return name.hashCode();}
    public boolean equals(Object o){
        return o != null && this.toString().equals(o.toString());
    }
}
[Thing{name=thing one}, Thing{name=thing two}] [Thing{name=three}, Thing{name=thing two}]