2012-04-07 17 views
28

मेरे पास ArrayList में संग्रहीत Customer ऑब्जेक्ट्स हैं। मेरा Customer कक्षा में 2 डेटा सदस्य हैं: Name और Email। अब मैं ग्राहक "डो" के लिए केवल Email को संशोधित करना चाहता हूं।ऐरेलिस्ट - किसी ऑब्जेक्ट के सदस्य को कैसे संशोधित करें?

अब अगर "डो" सूची में 3 सूचकांक में स्थित है, मैं जानता हूँ कि मैं इस लाइन लिख सकते हैं:

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

लेकिन यह एक नई वस्तु बनाने का मतलब है। अगर मेरे पास बहुत बड़ी सूची है, तो मुझे लगता है कि प्रक्रिया बहुत धीमी होगी। क्या ArrayList में संग्रहीत ऑब्जेक्ट के डेटा सदस्य को सीधे एक्सेस करने का कोई अन्य तरीका है, शायद ArrayList से किसी अन्य प्रकार के संग्रह का उपयोग करके? myList.get(3).setEmail("[email protected]")

उत्तर

3

Customer मान लिया जाये कि ईमेल के लिए एक सेटर है।

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

आप की जरूरत है तेजी से देखने (मूल रूप से निरंतर समय) एक वस्तु अपने संग्रह में संग्रहीत की आप सूची के बजाय मानचित्र का उपयोग करना चाहिए ।

यदि आपको वस्तुओं की तेज़ पुनरावृत्ति की आवश्यकता है तो आपको सूची का उपयोग करना चाहिए।

अपने मामले में

तो ...

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 कक्षाएं, मुख्य और ग्राहक बनाने के लिए और सही वर्ग के लिए दोनों वर्गों से सामग्री पेस्ट कॉपी; फिर मुख्य वर्ग चलाएं।

1

आप इंडेक्स की पहचान करने के लिए सरणी सूची के माध्यम से पुन: सक्रिय कर सकते हैं और आखिरकार ऑब्जेक्ट जिसे आप संशोधित करने की आवश्यकता है। आप नीचे के रूप में उसी के लिए के लिए-प्रत्येक का उपयोग कर सकते हैं:,

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

यहाँ ग्राहक ArrayList में वस्तु उपस्थित लिए एक संदर्भ है तो आप इस ग्राहक संदर्भ के किसी भी संपत्ति को बदलते हैं, इन परिवर्तनों को आपके वस्तु में संग्रहीत में प्रतिबिंबित करेगा सारणी सूची।

+0

यह एनपीई नहीं बचा से भर listArrays साथ ठीक काम करता है। -> "डो" .equals (customer.getName()), Btw: क्यों आप पहली बार मैच के बाद बंद नहीं करते? को सही .. दोनों अंक के लिए –

+0

धन्यवाद ध्यान में रखने के अच्छे हैं। – Mahendra

0

ठीक है आपने पोजो एंटिटी का उपयोग किया है ताकि आप ऐसा कर सकें। आपको उस वस्तु का ऑब्जेक्ट प्राप्त करने की आवश्यकता है और डेटा सेट करना होगा।

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

इस तरह आप ऐसा कर सकते हैं। या आप भी अन्य परम सेट कर सकते हैं।

0

इसे आज़माएं। यह कोड को घुमाने और आर्रेलिस्ट के सभी तत्वों में से एक बार फ़ील्ड को संशोधित करते समय काम करता है।

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

फिक्स्ड। मैं गलत था: यह केवल तत्व पुनर्मूल्यांकन पर लागू होता है। मैंने सोचा कि लौटाया गया ऑब्जेक्ट नया संदर्भ नहीं दे रहा था।

यह किया जा सकता है।

क्यू: क्यों?
एक: 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 दहन सही है। यह उत्तर वस्तुओं के लिए सही नहीं है। कृपया इसे संशोधित करें या हटा दें। –

0

समारोह यहां है बिना ... यह वस्तुओं

उदाहरण `

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, .... 
      } 
संबंधित मुद्दे