web-dev-qa-db-fra.com

ArrayList - Comment modifier un membre d'un objet?

J'ai un certain nombre d'objets Customer stockés dans une ArrayList. Ma classe Customer a 2 membres de données: Name et Email. Je souhaite maintenant modifier uniquement la Email pour le client "Doe".

Maintenant, si "Doe" est situé à l'index 3 de la liste, je sais que je peux écrire cette ligne:

myList.set( 3, new Customer( "Doe", "[email protected]" ) );

Mais cela signifie créer un nouvel objet. Si j'ai une très grande liste, je suppose que le processus serait très lent. Existe-t-il un autre moyen d'accéder directement au membre de données d'un objet stocké dans une liste de tableaux, en utilisant éventuellement un autre type de collection que ArrayList?

30
user1318796

Tu peux le faire:

myList.get(3).setEmail("new email");
37
m3th0dman

Fixé. J'avais tort: ​​cela ne s'applique que lors de la réaffectation d'éléments. Je pensais que l'objet retourné ne faisait pas référence au nouvel objet.

Ça peut être fait.

Q: Pourquoi?
UNE: La méthode get () renvoie un objet référençant celui d'origine.

Donc, si vous écrivez myArrayList.get(15).itsVariable = 7
ou
myArrayList.get(15).myMethod("My Value"),
vous attribuez une valeur/en utilisant une méthode de la objet référencé par celui renvoyé (cela signifie que la modification est appliquée à l'objet d'origine)</ i>

La seule chose que vous ne peut pas do est myArrayList.get(15) = myNewElement. Pour ce faire, vous devez utiliser la méthode list.set().

6
Axel Montini

En supposant que Customer a un paramètre pour le courrier électronique - myList.get(3).setEmail("[email protected]")

4
Petar Minchev

Je vous ai écrit 2 cours pour vous montrer comment faire. Principal et client. Si vous exécutez la classe principale, vous voyez ce qui se passe:

import Java.util.*;

public class Customer {

    private String name;
    private String email;

    public Customer(String name, String email) {
        this.name = name;
        this.email = email;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return name + " | " + email;
    }

    public static String toString(Collection<Customer> customers) {
        String s = "";
        for(Customer customer : customers) {
            s += customer + "\n";
        }
        return s;
    }

}


import Java.util.*;

public class Main {

    public static void main(String[] args) {
        List<Customer> customers = new ArrayList<>();
        customers.add(new Customer("Bert", "[email protected]"));
        customers.add(new Customer("Ernie", "[email protected]"));
        System.out.println("customers before email change - start");
        System.out.println(Customer.toString(customers));
        System.out.println("end");
        customers.get(1).setEmail("[email protected]");
        System.out.println("customers after email change - start");
        System.out.println(Customer.toString(customers));
        System.out.println("end");
    }

}

pour que cela fonctionne, créez 2 classes, Main et Customer et copiez-collez le contenu des deux classes dans la classe appropriée; puis lancez la classe principale.

3
Tom

Vous pouvez parcourir arraylist pour identifier l'index et éventuellement l'objet que vous devez modifier. Vous pouvez utiliser pour-chacun pour les mêmes que ci-dessous:

for(Customer customer : myList) {
    if(customer!=null && "Doe".equals(customer.getName())) {
        customer.setEmail("[email protected]");
        break;
    }
}

Ici client est une référence à l'objet présent dans Arraylist. Si vous modifiez une propriété de cette référence client, ces modifications seront reflétées dans votre objet stocké dans Arraylist.

3
Mahendra

Utilisez myList.get(3) pour accéder à l'objet actuel et le modifier, en supposant que les instances de Customer ont un moyen d'être modifiées.

2
hmjd

Vous pouvez simplement effectuer un accès à la collection, puis modifier les attributs du client sur lequel vous venez juste de procéder. Il n'est pas nécessaire de modifier la collection ni de créer un nouveau client:

int currentCustomer = 3;

// get the customer at 3
Customer c = list.get(currentCustomer);
// change his email
c.setEmail("[email protected]");
1
SunKing2

Eh bien, vous avez utilisé l'entité Pojo pour pouvoir le faire ... vous devez obtenir un objet et définir des données.

myList.get(3).setEmail("email");

de cette façon tu peux le faire. ou vous pouvez définir d'autres paramètres aussi.

0
Krishna

Quelle que soit la méthode utilisée, il y aura toujours une boucle comme dans removeAll() et set().

Donc, j'ai résolu mon problème comme ceci:

for (int i = 0; i < myList.size(); i++) {

        if (myList.get(i).getName().equals(varName)) {

            myList.get(i).setEmail(varEmail);
            break;

        }
    }

varName = "Doe" et varEmail = "[email protected]".

J'espère que cela vous aidera.

0
Aliton Oliveira

Si vous avez besoin d'une recherche rapide (essentiellement du temps constant) d'un objet stocké dans votre collection, utilisez plutôt Carte que Liste.

Si vous avez besoin d'une itération rapide des objets, vous devez utiliser List.

Donc dans ton cas ...

Map<String,Customer> customers = new HashMap<String,Customer>();

//somewhere in the code you fill up the Map, assuming customer names are unique
customers.put(customer.getName(), customer)

// at some later point you retrieve it like this; 
// this is fast, given a good hash
// been calculated for the "keys" in your map, in this case the keys are unique 
// String objects so the default hash algorithm should be fine
Customer theCustomerYouLookFor = customers.get("Doe");

// modify it
theCustomerYouLookFor.setEmail("[email protected]")
0
Svilen

Sans fonction, voilà ... ça marche très bien avec les listArrays remplis d'objets

exemple `

al.add(new Student(101,"Jack",23,'C'));//adding Student class object  
      al.add(new Student(102,"Evan",21,'A'));  
      al.add(new Student(103,"Berton",25,'B'));  
      al.add(0, new Student(104,"Brian",20,'D'));
      al.add(0, new Student(105,"Lance",24,'D'));
      for(int i = 101; i< 101+al.size(); i++) {  
              al.get(i-101).rollno = i;//rollno is 101, 102 , 103, ....
          }
0
George

Essayez ceci. Cela fonctionne tout en parcourant le code et en modifiant les champs à la fois de tous les éléments de Arraylist.

public Employee(String name,String email){
this.name=name;
this.email=email;
}

public void setName(String name) {
this.name = name;
}

public String getName() {
return name;
}

public void setEmail(String email) {
this.email = email;
}

public String getEmail() {
return email;
}

for(int i=0;i++){
List.get(i).setName("Anonymous");
List.get(i).setEmail("[email protected]");
}
0
Udit Mishra