我有一些存储在ArrayList中的Customer
个对象。我的Customer
班级有2位数据成员:Name
和Email
。现在我想修改客户“Doe”的Email
。
现在,如果“Doe”位于列表中的索引3,我知道我可以写下这一行:
myList.set( 3, new Customer( "Doe", "j.doe@supermail.com" ) );
但这意味着要创建一个新对象。如果我有一个非常大的列表,我想这个过程会很慢。有没有其他方法直接访问存储在ArrayList中的Object的数据成员,可能使用另一种Collection而不是ArrayList?
答案 0 :(得分:37)
你可以这样做:
myList.get(3).setEmail("new email");
答案 1 :(得分:6)
固定。我错了:这只适用于元素重新分配。我认为返回的对象没有引用新对象。
可以做到。
Q :为什么?
A :get()方法返回引用原始对象的对象。
所以,如果你写myArrayList.get(15).itsVariable = 7
或myArrayList.get(15).myMethod("My Value")
,你实际上是在分配一个值/使用返回的引用的对象中的方法(这意味着,更改应用于原始对象)
< / p>
为此,您必须使用myArrayList.get(15) = myNewElement
方法。
答案 2 :(得分:4)
假设Customer
有一封电子邮件设定者 - myList.get(3).setEmail("j.doe@supermail.com")
答案 3 :(得分:3)
我写了两个课,向你展示它是如何完成的;主要和客户。如果你运行Main类,你会看到发生了什么:
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", "bert@gmail.com"));
customers.add(new Customer("Ernie", "ernie@gmail.com"));
System.out.println("customers before email change - start");
System.out.println(Customer.toString(customers));
System.out.println("end");
customers.get(1).setEmail("new.email@gmail.com");
System.out.println("customers after email change - start");
System.out.println(Customer.toString(customers));
System.out.println("end");
}
}
要使其运行,请创建2个类,Main和Customer,并将两个类中的内容复制粘贴到正确的类中;然后运行Main类。
答案 4 :(得分:3)
您可以遍历arraylist来识别索引,最终识别需要修改的对象。你可以使用for-each,如下所示:
for(Customer customer : myList) {
if(customer!=null && "Doe".equals(customer.getName())) {
customer.setEmail("abc@xyz.com");
break;
}
}
此处客户是对Arraylist中存在的对象的引用,如果您更改此客户引用的任何属性,这些更改将反映在存储在Arraylist中的对象中。
答案 5 :(得分:2)
使用myList.get(3)
来访问当前对象并对其进行修改,假设Customer
的实例有一种方法可以修改。
答案 6 :(得分:2)
您可以只对集合进行操作,然后只需修改刚刚执行“获取”的客户的属性即可。无需修改集合,也无需创建新客户:
int currentCustomer = 3;
// get the customer at 3
Customer c = list.get(currentCustomer);
// change his email
c.setEmail("somethingelse@example.com");
答案 7 :(得分:0)
如果您需要快速查找(基本上是恒定时间)存储在集合中的对象,则应使用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("newEmail@stackoverflow.com")
答案 8 :(得分:0)
你使用过Pojo Entity所以你可以这样做。 你需要得到它的对象并且必须设置数据。
myList.get(3).setEmail("email");
那样你就可以做到这一点。或者你也可以设置其他参数。
答案 9 :(得分:0)
试试这个。这可以在遍历代码并一次修改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("xyz@abc.com");
}
答案 10 :(得分:0)
这里没有函数它是......它可以与填充了Objects
的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, ....
}
答案 11 :(得分:0)
您使用的任何方法,总会像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 = "j.doe@supermail.com"
处。
希望对您有帮助。