39

我有许多Customer对象存储在 ArrayList 中。我的Customer班级有 2 个数据成员:NameEmail. 现在我只想Email为客户“Doe”修改。

现在,如果“Doe”位于列表中的索引 3,我知道我可以写下这一行:

myList.set( 3, new Customer( "Doe", "j.doe@supermail.com" ) );

但这意味着创建一个新对象。如果我有一个很大的列表,我想这个过程会很慢。有没有其他方法可以直接访问存储在 ArrayList 中的 Object 的数据成员,可能是使用除 ArrayList 之外的另一种集合?

4

12 回答 12

50

你可以这样做:

myList.get(3).setEmail("new email");
于 2012-04-07T08:49:17.697 回答
11

固定的。我错了:这只适用于元素重新分配。我认为返回的对象没有引用新的对象。

可以办到。

:为什么?
:get() 方法返回一个引用原始对象的对象。

因此,如果您编写myArrayList.get(15).itsVariable = 7
or
myArrayList.get(15).myMethod("My Value")
您实际上是在使用返回的对象引用的对象中的方法分配值 / (这意味着更改将应用​​于原始对象)

你唯一不能做的就是myArrayList.get(15) = myNewElement。为此,您必须使用list.set()方法。

于 2015-06-13T16:07:15.247 回答
7

您可以遍历 arraylist 以识别索引以及最终需要修改的对象。您可以使用 for-each 如下所示:

for(Customer customer : myList) {
    if(customer!=null && "Doe".equals(customer.getName())) {
        customer.setEmail("abc@xyz.com");
        break;
    }
}

这里的客户是对存在于 Arraylist 中的对象的引用,如果您更改此客户引用的任何属性,这些更改将反映在您存储在 Arraylist 中的对象中。

于 2012-04-07T09:13:14.627 回答
6

假设Customer有一个电子邮件设置器 -myList.get(3).setEmail("j.doe@supermail.com")

于 2012-04-07T08:46:48.603 回答
4

我给你写了两节课来告诉你它是如何完成的;主要和客户。如果你运行 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 类。

于 2012-04-07T09:04:38.173 回答
3

您可以对集合进行获取,然后只需修改您刚刚“获取”的客户的属性。无需修改集合,也无需创建新客户:

int currentCustomer = 3;

// get the customer at 3
Customer c = list.get(currentCustomer);
// change his email
c.setEmail("somethingelse@example.com");
于 2012-04-07T08:58:02.560 回答
3

用于myList.get(3)访问当前对象并对其进行修改,假设 的实例Customer可以修改。

于 2012-04-07T08:46:57.430 回答
2

好吧,你已经使用了 Pojo Entity,所以你可以做到这一点。你需要得到那个对象并且必须设置数据。

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

这样你就可以做到。或者你也可以设置其他参数。

于 2014-05-06T06:51:38.360 回答
1

如果您需要快速查找存储在集合中的对象(基本上是恒定时间),您应该使用 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")
于 2012-04-07T09:03:41.567 回答
1

这里没有功能......它适用于充满对象的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, ....
          }
于 2017-11-01T15:00:13.183 回答
1

你使用的任何方法,总会有一个像 inremoveAll()和的循环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"

我希望这对你有帮助。

于 2019-02-09T04:06:38.583 回答
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");
}
于 2015-01-12T09:56:34.723 回答