2015-06-29 50 views
1

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

因此,我可以检查Fido是否存在于ArrayList中,但是如何检索它以便我可以进行更改?以下是我最近的一次。我要寻找的线沿线的东西dogs.getElementEqualTo(new Dog("Fido"));

import java.util.ArrayList; 

public class Dog { 

    public static void main(String[] args) { 
     ArrayList<Dog> dogs = new ArrayList<>(); 
     dogs.add(new Dog("Fido")); 
     Dog dog = new Dog("Fido"); 
     if (dogs.contains(dog)) { 
      dog.name = "Fluffy"; 
     } 
     System.out.println(dogs.get(0).name); //prints Fido 
    } 

    String name; 

    public Dog(String name) { 
     this.name = name; 
    } 

    @Override 
    public boolean equals(Object o) { 
     if (this == o) return true; 
     if (!(o instanceof Dog)) return false; 

     Dog dog = (Dog) o; 

     return !(name != null ? !name.equals(dog.name) : dog.name != null); 
    } 

    @Override 
    public int hashCode() { 
     return name != 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); 
+0

该代码的作用是什么?显示输出。 –

+1

只是循环的元素,并检查每一个(或只是直到第一个)。 –

+0

@SotiriosDelimanolis darn。会做。我希望有一个更漂亮的方式,但这将工作。谢谢! – Evorlor

回答

2

你可以得到(第一)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. 
    } 
} 
+0

我改变了主方法,并且它不起作用: ArrayList dogs = new ArrayList <>() ; dogs.add(新狗(“Fido”)); 狗狗=新狗(“Fido”); (dogs.contains(狗))dogs.get(dogs.indexOf(dog))。name =“Fluffy”; } System.out.println(dogs.get(0).name); – Evorlor

+0

你确定你的'equals'方法是正确的吗? –

+1

另外,您不需要分别调用'contains'和'indexOf' - 如果找不到元素,'indexOf'将返回-1。你基本上是两次扫描列表。 –

1
boolean found = false; 
for(Dog a : dogs) { 
    if(a.name.equals("Fluffy") { 
     a.name = "Fido"; 
     found = true; 
} 

if(!found) { 
    dogs.add(new Dog("Fido")); 
} 

我不完全知道如何你狗对象在内部工作,我的答案是基于Dog类是这样的想法:

public static String name; 
public Dog(String name) { 
    this.name = name; 
} 
0

if (dogs.contains(dog))正在评估真实的,你会想,但你要修改的局部变量dog而不是Dog对象的ArrayList

更改内部

dog.name = "Fluffy"; 

dogs.get(dogs.indexOf(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 
} 
0

如果您使用的是Java 8中,您可以在List流使用filter,然后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()); 
    } 
} 

和输出

 
[Thing{name=thing one}, Thing{name=thing two}] 
[Thing{name=three}, Thing{name=thing two}]

注意,第一个元素已被更改。

相关问题