Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Q: Почему?
A: метод get() возвращает объект, ссылающийся на исходный.

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

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

Ответ 3

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

Ответ 4

Я написал вам 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 и скопируйте содержимое из обоих классов в правильный класс; затем запустите основной класс.

Ответ 5

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

Ответ 6

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

int currentCustomer = 3;

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

Ответ 7

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

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

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

Ответ 8

Если вам нужен быстрый поиск (в основном постоянное время) объекта, хранящегося в вашей коллекции, вы должны использовать 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]")

Ответ 9

Хорошо, что вы использовали объект Pojo, поэтому вы можете это сделать. u нужно получить объект этого и установить данные.

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

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

Ответ 10

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

Ответ 11

Без функции здесь он... отлично работает с 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, ....
          }