ArrayList - 如何修改对象的成员?

时间:2012-04-07 08:43:50

标签: java collections pojo

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

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

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

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

12 个答案:

答案 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"处。

希望对您有帮助。