ArrayList - как изменить член объекта?

У меня есть несколько Customer объектов, хранящихся в ArrayList. В моем классе Customer есть 2 члена данных: Name и Email. Теперь я хочу изменить только Email для клиента «Doe».

Теперь, если "Doe" находится в индексе 3 в списке, я знаю, что могу написать эту строку:

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

Но это означает создание нового объекта. Если бы у меня был очень большой список, я полагаю, процесс был бы очень медленным. Есть ли другой способ получить прямой доступ к элементу данных объекта, хранящегося в ArrayList, возможно, с помощью другого типа Collection, чем ArrayList?


person user1318796    schedule 07.04.2012    source источник


Ответы (12)


Ты можешь сделать это:

myList.get(3).setEmail("new email");
person Random42    schedule 07.04.2012

Фиксированный. Я ошибся: это касается только переназначения элемента. Я думал, что возвращенный объект не ссылается на новый.

Это может быть сделано.

Q: Why?
A: The get() method returns an object referencing the original one.

Итак, если вы пишете myArrayList.get(15).itsVariable = 7
или
myArrayList.get(15).myMethod("My Value"),
вы фактически назначаете значение / используете метод из объекта, на который ссылается возвращаемый объект (это означает, изменение применяется к исходному объекту)

Единственное, что вы не можете сделать, - это myArrayList.get(15) = myNewElement. Для этого нужно использовать метод list.set().

person Axel Montini    schedule 13.06.2015
comment
Это не так. Это правда, что ArrayList.get () возвращает копию элемента, но в случае, если элемент является объектом (как это было бы для списка автора вопроса ‹Customer›), он возвращает копию ссылки на объект. Любые изменения, внесенные вами в эту ссылку, будут отражены в списке, поскольку ссылка указывает на то же место в памяти, что и объект в списке. Итак, это: myList.get(3).setEmail("[email protected]"); изменит клиента в позиции 3 в электронном письме со списком. - person toinetoine; 13.04.2016
comment
@ Антуан Дахан прав. Этот ответ неверен для объектов. Пожалуйста, измените или удалите его. - person Jacob R; 06.09.2016

Вы можете выполнить итерацию по arrayylist, чтобы идентифицировать индекс и, в конечном итоге, объект, который вам нужно изменить. Вы можете использовать for-each для того же, что и ниже:

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

Здесь клиент - это ссылка на объект, присутствующий в Arraylist. Если вы измените какое-либо свойство этой ссылки клиента, эти изменения отразятся в вашем объекте, хранящемся в Arraylist.

person Mahendra    schedule 07.04.2012
comment
Это не спасение. - ›Doe.equals (customer.getName ()), BTW: Почему вы не останавливаетесь после первого матча? - person Marcel Jaeschke; 07.04.2012
comment
спасибо за исправление .. оба пункта стоит иметь в виду. - person Mahendra; 08.04.2012

Предполагая, что у Customer есть сеттер для электронной почты - myList.get(3).setEmail("[email protected]")

person Petar Minchev    schedule 07.04.2012

Я написал вам 2 урока, чтобы показать, как это делается; Главный и Заказчик. Если вы запустите основной класс, вы увидите, что происходит:

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

}

чтобы запустить это, сделайте 2 класса, Main и Customer, и скопируйте и вставьте содержимое обоих классов в правильный класс; затем запустите основной класс.

person Tom    schedule 07.04.2012

Используйте myList.get(3), чтобы получить доступ к текущему объекту и изменить его, предполагая, что экземпляры Customer могут быть изменены.

person hmjd    schedule 07.04.2012

Вы можете просто получить доступ к коллекции, а затем просто изменить атрибуты клиента, с которым вы только что «познакомились». Нет необходимости ни изменять коллекцию, ни создавать нового клиента:

int currentCustomer = 3;

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

Ну, вы использовали Pojo Entity, поэтому можете это сделать. Вам нужно получить объект этого и установить данные.

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

таким образом ты сможешь это сделать. Или вы также можете установить другие параметры.

person Kishan Bheemajiyani    schedule 06.05.2014

Если вам нужен быстрый поиск (в основном постоянное время) объекта, хранящегося в вашей коллекции, вы должны использовать Map вместо List.

Если вам нужна быстрая итерация объектов, вы должны использовать List.

Так что в твоем случае ...

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]")
person Svilen    schedule 07.04.2012

Без функции вот она ... она отлично работает с listArrays, заполненными объектами

пример `

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, ....
          }
person George    schedule 01.11.2017

Любой метод, который вы используете, всегда будет иметь цикл, как в removeAll() и set().

Итак, я решил свою проблему так:

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

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

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

        }
    }

Где varName = "Doe" и varEmail = "[email protected]".

Надеюсь, это вам поможет.

person Aliton Oliveira    schedule 09.02.2019

Попробуйте это. Это работает при обходе кода и изменении полей сразу всех элементов 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]");
}
person CuriousCase    schedule 12.01.2015