Ответ 1
Вы можете сделать это:
myList.get(3).setEmail("new email");
У меня есть несколько объектов Customer
, хранящихся в ArrayList. Мой класс Customer
имеет 2 элемента данных: Name
и Email
. Теперь я хочу изменить только Email
для клиента Doe.
Теперь, если "Doe" находится в индексе 3 в списке, я знаю, что могу написать эту строку:
myList.set( 3, new Customer( "Doe", "[email protected]" ) );
Но это означает создание нового объекта. Если у меня есть очень большой список, я предполагаю, что процесс будет очень медленным. Есть ли другой способ прямого доступа к элементу данных объекта, хранящегося в ArrayList, возможно, используя другой вид коллекции, чем ArrayList?
Вы можете сделать это:
myList.get(3).setEmail("new email");
Фиксированный. Я ошибался: это применимо только к переназначению элемента. Я думал, что возвращенный объект не ссылается на новый.
Это можно сделать.
Q: Почему?
A: метод get() возвращает объект, ссылающийся на исходный.
Итак, если вы пишетеmyArrayList.get(15).itsVariable = 7
илиmyArrayList.get(15).myMethod("My Value")
,
вы фактически присваиваете значение/используя метод из объекта , на который ссылается, на возвращенный (это означает, что изменение применяется к исходному объекту)
Единственное, что вы не можете сделать, это myArrayList.get(15) = myNewElement
. Для этого вам нужно использовать метод list.set()
.
Предполагая, что Customer
имеет сеттер для электронной почты - myList.get(3).setEmail("[email protected]")
Я написал вам 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 и скопируйте содержимое из обоих классов в правильный класс; затем запустите основной класс.
Используйте myList.get(3)
, чтобы получить доступ к текущему объекту и изменить его, если предположить, что экземпляры Customer
могут быть изменены.
Вы можете просто получить доступ к коллекции, а затем просто изменить атрибуты клиента, с которым вы только что "набрали". Нет необходимости изменять коллекцию, и нет необходимости создавать нового клиента:
int currentCustomer = 3;
// get the customer at 3
Customer c = list.get(currentCustomer);
// change his email
c.setEmail("[email protected]");
Вы можете выполнить итерацию через arraylist, чтобы идентифицировать индекс и в конечном итоге объект, который вам нужно изменить. Вы можете использовать for-each так же, как показано ниже:
for(Customer customer : myList) {
if(customer!=null && "Doe".equals(customer.getName())) {
customer.setEmail("[email protected]");
break;
}
}
Здесь клиент является ссылкой на объект, присутствующий в Arraylist. Если вы измените какое-либо свойство этой ссылки клиента, эти изменения отразятся в вашем объекте, хранящемся в Arraylist.
Если вам нужен быстрый поиск (в основном постоянное время) объекта, хранящегося в вашей коллекции, вы должны использовать 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]")
Хорошо, что вы использовали объект Pojo, поэтому вы можете это сделать. u нужно получить объект этого и установить данные.
myList.get(3).setEmail("email");
таким образом, вы можете это сделать. или u также может установить другой параметр.
Попробуйте это. Это работает при перемещении кода и изменении полей сразу из всех элементов 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]");
}
Без функции здесь он... отлично работает с 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, ....
}