ArrayListには多くのCustomer
オブジェクトが保存されています。 Customer
クラスには、Name
とEmail
の2つのデータメンバーがあります。ここで、顧客「Doe」のEmail
のみを変更します。
「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")
、
実際に値を割り当てています/からのメソッドを使用して 参照されるオブジェクト 返されたものによって(これは、変更が元のオブジェクトに適用されることを意味します)
あなただけ できない doはmyArrayList.get(15) = myNewElement
です。これを行うには、list.set()
メソッドを使用する必要があります。
Customer
に電子メールのセッターがあると仮定-myList.get(3).setEmail("[email protected]")
2つのクラスを作成して、その方法を説明しました。メインおよび顧客。 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", "[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");
}
}
これを実行するには、MainとCustomerの2つのクラスを作成し、両方のクラスの内容をコピーして正しいクラスに貼り付けます。次に、メインクラスを実行します。
Arraylistを反復処理して、インデックスを特定し、最終的に変更する必要のあるオブジェクトを特定できます。以下と同じ目的でfor-eachを使用できます。
for(Customer customer : myList) {
if(customer!=null && "Doe".equals(customer.getName())) {
customer.setEmail("[email protected]");
break;
}
}
ここで、顧客はArraylistに存在するオブジェクトへの参照です。この顧客参照のプロパティを変更すると、これらの変更はArraylistに保存されたオブジェクトに反映されます。
コレクションを取得し、「取得」した顧客の属性を変更するだけです。コレクションを変更する必要も、新しい顧客を作成する必要もありません。
int currentCustomer = 3;
// get the customer at 3
Customer c = list.get(currentCustomer);
// change his email
c.setEmail("[email protected]");
myList.get(3)
を使用して、現在のオブジェクトへのアクセスを取得し、Customer
のインスタンスに変更する方法があると仮定して変更します。
さて、これを行うにはPojo Entityを使用しました。そのオブジェクトを取得し、データを設定する必要があります。
myList.get(3).setEmail("email");
そのようにあなたはそれを行うことができます。または、他のパラメータも設定できます。
使用するメソッドには、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 = "[email protected]"
。
これがお役に立てば幸いです。
コレクションに保存されているオブジェクトの高速ルックアップ(基本的に一定時間)が必要な場合は、リストの代わりにマップを使用する必要があります。
オブジェクトの高速反復が必要な場合は、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]")
ここに関数がなければ、それは...オブジェクトで満たされた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, ....
}
これを試してください。これは、コードを走査し、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]");
}