2012-04-07 4 views
28

私はCustomer個のオブジェクトをArrayListに格納しています。私のCustomerクラスは、2つのデータメンバー:NameEmailを持っています。今私はお客様の "Doe"についてEmailを変更したいと思います。ArrayList - オブジェクトのメンバーを変更するには?

myList.set(3, new Customer("Doe", "[email protected]")); 

しかし、それは新しいオブジェクトを作成することを意味:「ドウ」のリストにインデックス3に配置されている場合

は今、私はこの行を書くことができます知っています。もし私が非常に大きなリストを持っていれば、そのプロセスは非常に遅くなると思います。 ArrayListに格納されたObjectのデータメンバーに直接アクセスする他の方法はありますか?ArrayList以外の別の種類のCollectionを使用していますか? Customerを想定し

答えて

3

は、電子メールのセッターを持っている - myList.get(3).setEmail("[email protected]")

2

使用myList.get(3)現在のオブジェクトへのアクセスを取得し、それを修正するために、Customerのインスタンスを変更する方法を持っていると仮定します。あなたがこれを行うことができます

36

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

をあなただけのコレクションで入手できますすることができ、その後ただあなただけに「取得」でした顧客の属性を変更します。コレクションを変更する必要はありませんも新しい顧客を作成する必要があります:

int currentCustomer = 3; 

// get the customer at 3 
Customer c = list.get(currentCustomer); 
// change his email 
c.setEmail("[email protected]"); 
0

あなたのコレクションに格納されているオブジェクトの高速検索(基本的には一定の時間)を必要とする場合は、リストの代わりに地図を使用する必要があります。

オブジェクトを高速に反復する必要がある場合は、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]") 
3

私はどのように行うのをお見せするためにあなたに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クラスを実行します。

1

arraylistを使用してインデックスを識別し、最終的に変更するオブジェクトを識別できます。あなたは以下のように同じのためにのために、それぞれ使用することができます。

for(Customer customer : myList) { 
    if(customer!=null && "Doe".equals(customer.getName())) { 
     customer.setEmail("[email protected]"); 
     break; 
    } 
} 

ここでは、顧客はArrayListの中に存在する物体への参照である、あなたはこの顧客の参照の任意のプロパティを変更した場合、これらの変更がに保存されているオブジェクトに反映されます配列リスト。

+0

で満たさlistArraysと正常に動作します。 - > "ドウ" .equals(customer.getName())、 ところで:なぜあなたは最初の試合後に停止しませんか? –

+0

訂正していただきありがとうございます..両方の点を覚えておいてください。 – Mahendra

0

Pojoエンティティを使用しているので、これを行うことができます。 あなたはそのオブジェクトを取得し、データを設定する必要があります。

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

そのようにすることができます。または他のパラメータを設定することもできます。

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("[email protected]"); 
} 
6

固定。私は間違っていた:これは要素の再割り当てにのみ適用されます。私は返されたオブジェクトが新しいものを参照していないと思った。

それは行うことができます。

Q:なぜですか?
A:get()メソッドは、オリジナルのものを参照するオブジェクトを返します。

したがって、あなたが実際によってを参照オブジェクトからメソッドを使用して/値を割り当てるmyArrayList.get(15).itsVariable = 7
又は
myArrayList.get(15).myMethod("My Value")
を書き込む場合に返さ一方(この変更は、元のオブジェクトに適用される、手段)

あなたがを行うことができない唯一のものはmyArrayList.get(15) = myNewElementです。これを行うには、list.set()メソッドを使用する必要があります。ここにある機能なし

+4

これは正しくありません。これを[ArrayList.get()](https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#get(intは))要素のコピーを返すことは事実ですが、 (それは質問の作者の一覧のためになるような)要素がオブジェクトである場合には、そのオブジェクトへの参照のコピーを返します。参照は、リスト内のオブジェクトと同じ場所をメモリ内に指しているため、この参照に対して行う変更はすべてリストに反映されます。だから、これは: 'myList.getは(3).setEmail( "[email protected]");'リストの電子メールでのpos 3でお客様を変更します。 –

+0

@Antoine Dahanが正しいです。この回答はオブジェクトに対しては正しくありません。変更または削除してください。 –

0

は...それはオブジェクト

例これは、保存NPEない `

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, .... 
      } 
関連する問題