39

ArrayListにいくつかのCustomerオブジェクトが格納されています。私Customerのクラスには2つのデータメンバーがあります:NameEmailEmailここで、顧客「Doe」のみを変更したいと思います。

「Doe」がリストのインデックス3にある場合、次の行を記述できることがわかります。

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

しかし、それは新しいオブジェクトを作成することを意味します。私が非常に大きなリストを持っている場合、プロセスは非常に遅いと思います。ArrayList以外の種類のコレクションを使用して、ArrayListに格納されているオブジェクトのデータメンバーに直接アクセスする他の方法はありますか?

4

12 に答える 12

50

あなたはこれを行うことができます:

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

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

それはできます。

Q : なぜですか?
A : 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;
    }
}

ここで、customer は 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

どのように行われるかを示すために、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", "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");
    }

}

これを実行するには、Main と Customer の 2 つのクラスを作成し、両方のクラスの内容をコピーして正しいクラスに貼り付けます。次に Main クラスを実行します。

于 2012-04-07T09:04:38.173 に答える
3

myList.get(3)インスタンスに変更する方法があると仮定して、現在のオブジェクトにアクセスして変更するために使用しますCustomer

于 2012-04-07T08:46:57.430 に答える
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 に答える
2

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

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

そうすればそれができます。または、他のパラメーターも設定できます。

于 2014-05-06T06:51:38.360 に答える
1

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

オブジェクトの高速反復が必要な場合は、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 に答える
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 に答える