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?
Tu peux le faire:
myList.get(3).setEmail("new email");
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 écrivezmyArrayList.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()
.
En supposant que Customer
a un paramètre pour le courrier électronique - myList.get(3).setEmail("[email protected]")
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.
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.
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.
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]");
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.
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;
}
}
Où varName = "Doe"
et varEmail = "[email protected]"
.
J'espère que cela vous aidera.
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]")
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, ....
}
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]");
}