web-dev-qa-db-de.com

ArrayList - So ändern Sie ein Mitglied eines Objekts

Ich habe mehrere Customer-Objekte in einer ArrayList gespeichert. Meine Customer-Klasse hat 2 Datenmitglieder: Name und Email. Jetzt möchte ich nur die Email für den Kunden "Doe" ändern.

Wenn "Doe" in der Liste auf Index 3 steht, weiß ich, dass ich diese Zeile schreiben kann:

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

Das bedeutet aber, dass Sie ein neues Objekt erstellen. Wenn ich eine sehr große Liste habe, wäre der Prozess vermutlich sehr langsam. Gibt es eine andere Möglichkeit, direkt auf das Datenelement eines Objekts zuzugreifen, das in einer ArrayList gespeichert ist, möglicherweise durch Verwendung einer anderen Art von Collection als ArrayList?

30
user1318796

Du kannst das:

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

Fest. Ich habe mich geirrt: Dies gilt nur für die Neuzuweisung von Elementen. Ich dachte, dass das zurückgegebene Objekt nicht auf das neue verweist.

Es kann getan werden.

Q.: Warum?
EIN: Die Methode get () gibt ein Objekt zurück, das auf das ursprüngliche Objekt verweist.
Also, wenn Sie schreiben myArrayList.get(15).itsVariable = 7
oder
myArrayList.get(15).myMethod("My Value"),
Sie weisen tatsächlich einen Wert zu/verwenden eine Methode aus dem objekt referenziert vom zurückgegebenen (dh die Änderung wird auf das ursprüngliche Objekt angewendet)

Das einzige was du kippen do ist myArrayList.get(15) = myNewElement. Dazu müssen Sie die Methode list.set() verwenden.

7
Axel Montini

Angenommen, Customer hat einen Setzer für E-Mails - myList.get(3).setEmail("[email protected]")

4
Petar Minchev

Ich habe dir 2 Klassen geschrieben, um dir zu zeigen, wie es gemacht wird. Haupt- und Kunden. Wenn Sie die Main-Klasse ausführen, sehen Sie, was los ist:

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");
    }

}

um dies auszuführen, machen Sie 2 Klassen, Main und Customer, und fügen Sie den Inhalt aus beiden Klassen in die richtige Klasse ein. Führen Sie dann die Main-Klasse aus.

3
Tom

Sie können durch arraylist iterieren, um den Index und eventuell das zu ändernde Objekt zu identifizieren. Sie können for-each wie folgt verwenden:

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

Hier ist der Kunde eine Referenz auf das in Arraylist vorhandene Objekt. Wenn Sie eine Eigenschaft dieser Kundenreferenz ändern, werden diese Änderungen in Ihrem in Arraylist gespeicherten Objekt übernommen.

3
Mahendra

Verwenden Sie myList.get(3), um auf das aktuelle Objekt zuzugreifen und es zu ändern, vorausgesetzt, die Instanzen von Customer können geändert werden.

2
hmjd

Sie können die Sammlung einfach abrufen und dann die Attribute des Kunden ändern, für den Sie gerade eine Abfrage durchgeführt haben. Es ist nicht erforderlich, die Sammlung zu ändern oder einen neuen Kunden anzulegen:

int currentCustomer = 3;

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

Nun, Sie haben Pojo Entity verwendet, so dass Sie dies tun können.

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

so kannst du das machen. oder Sie können auch andere Parameter einstellen.

0
Krishna

Bei jeder Methode, die Sie verwenden, gibt es immer eine Schleife wie in removeAll() und set().

Also habe ich mein Problem so gelöst:

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

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

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

        }
    }

Wo varName = "Doe" und varEmail = "[email protected]".

Ich hoffe das hilft dir.

0
Aliton Oliveira

Wenn Sie eine schnelle Suche (im Wesentlichen konstante Zeit) eines in Ihrer Sammlung gespeicherten Objekts benötigen, sollten Sie Map statt List verwenden.

Wenn Sie eine schnelle Wiederholung der Objekte benötigen, sollten Sie List verwenden.

Also in deinem Fall ...

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

Ohne Funktion hier ist es ... es funktioniert gut mit listArrays, die mit Objekten gefüllt sind

beispiel `

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

Versuchen Sie dies. Dies funktioniert, während Sie den Code durchlaufen und die Felder aller Elemente von Arraylist gleichzeitig ändern.

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