অ্যারেআইন্ডেক্সআউটআউটবাউন্ডসএপশন যখন অ্যারেলিস্টের পুনরুক্তি ব্যবহার করে


103

এই মুহুর্তে, আমার কাছে কোডের একটি টুকরোযুক্ত একটি প্রোগ্রাম রয়েছে যা দেখতে এটির মতো দেখাচ্ছে:

while (arrayList.iterator().hasNext()) {
     //value is equal to a String value
     if( arrayList.iterator().next().equals(value)) {
          // do something 
     }
}

আমি কি ঠিক তাই করছি, অ্যারেলিস্টের মাধ্যমে যতদূর ঘুরিয়ে যায়?

আমি যে ত্রুটিটি পাচ্ছি তা হ'ল:

java.lang.ArrayIndexOutOfBoundsException: -1
    at java.util.ArrayList.get(Unknown Source)
    at main1.endElement(main1.java:244)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
    at javax.xml.parsers.SAXParser.parse(Unknown Source)
    at javax.xml.parsers.SAXParser.parse(Unknown Source)
    at main1.traverse(main1.java:73)
    at main1.traverse(main1.java:102)
    at main1.traverse(main1.java:102)
    at main1.main(main1.java:404)

আমি বাকী কোডটি প্রদর্শন করব, তবে এটি বেশ বিস্তৃত এবং আমি যদি পুনরাবৃত্তিটি সঠিকভাবে না করছি, তবে আমি একমাত্র সম্ভাবনাটি ধরে নেব যে আমি ArrayListসঠিকভাবে আরম্ভ করছি না ।


জাভা 8-তে আপনি এই forEachপদ্ধতিটি ব্যবহার করতে পারেন : স্ট্যাকওভারফ্লো
প্রশ্নগুলি

উত্তর:


229

আমি কি ঠিক তাই করছি, অ্যারেলিস্টের মাধ্যমে যতদূর ঘুরিয়ে যায়?

না: iteratorপ্রতিটি পুনরাবৃত্তিতে দুবার কল করে আপনি সারাক্ষণ নতুন পুনরাবৃত্তি পেয়ে যাচ্ছেন।

এই লুপটি লেখার সবচেয়ে সহজ উপায় হ'ল প্রতিটি কন্সট্রাক্ট ব্যবহার করে :

for (String s : arrayList)
    if (s.equals(value))
        // ...

জন্য

java.lang.ArrayIndexOutOfBoundsException: -1

আপনি কেবল -1একটি অ্যারের থেকে উপাদান নম্বর পাওয়ার চেষ্টা করেছেন । শূন্য থেকে গণনা শুরু হয়।


1
প্রত্যেকের জন্য ব্যবহার করুন, এটি অনেক সহজ। এছাড়াও এটি সম্ভব যে আপনি আবার অ্যারেলিস্ট.ইটিরেটর ()। (পরবর্তী।) আবার কল করে এবং এন্ট্রি এড়িয়ে গেছেন।

@ লারসম্যান আহ আপনাকে অনেক ধন্যবাদ আমি সম্পূর্ণরূপে ভুলে গেছি আপনি অ্যারে তালিকা দিয়ে এটি করতে পারেন। যাইহোক, আমি আমার কোড সহ এটি চেষ্টা করেছি এবং আমি এখনও একই ত্রুটি পাচ্ছি। সুতরাং আমি মনে করি কীভাবে কোডের আগে আমি অ্যারেলিস্টে যুক্ত করছি তার সাথে এটি একটি সমস্যা, তাই আমি এখন সেই ঠিকানাটি দেখব। তবুও, আপনাকে সে সম্পর্কে আমাকে স্মরণ করিয়ে দেওয়ার জন্য অনেক ধন্যবাদ।
এই 0ne Pr0grammer

প্রতিটি অপারেটরের জন্য যে ভালবাসা। আমি সর্বদা রুবিতে এর মতো কিছু ব্যবহার করি ... do array.each |s| unless (s.nil?) end end
ডেভিড ওয়েস্ট

2
শুধু লক্ষণীয়, Have you heard ofমনে হয় এক ধরনের আপত্তিকর (অকারণে), তবে আমি দেশীয় নই। অন্যথায় দুর্দান্ত।
n611x007

3
@ ন্যাক্সা: এটি শঙ্কিত হিসাবে আসতে পারে, আমি শব্দ পরিবর্তন করেছি।
ফ্রেড ফু

142

আমি স্বীকার করি যে গৃহীত উত্তরটি সাধারণত সর্বোত্তম সমাধান এবং স্পষ্টভাবে ব্যবহার করা সহজ, তবে আমি লক্ষ্য করেছি যে কেউই পুনরুক্তির সঠিক ব্যবহার প্রদর্শন করে নি। সুতরাং এখানে একটি দ্রুত উদাহরণ:

Iterator<Object> it = arrayList.iterator();
while(it.hasNext())
{
    Object obj = it.next();
    //Do something with obj
}

12
আমি মনে করি এটিকে আরও সঠিকভাবে প্রশ্নের উত্তর দেওয়া হয়েছে, কারণ এটি বিকল্প সমাধানের পরিবর্তে পুনরাবৃত্তির উদাহরণ।
ক্লাসবিহীন

1
আপনার অন্তর্দৃষ্টিপূর্ণ প্রতিক্রিয়া জন্য আপনাকে ধন্যবাদ। (...) জন্য পুনরাবৃত্তি সাধারণত সর্বোত্তম সমাধান তবে সর্বদা নয়। আজ, আমি স্পষ্টতভাবে পরিচালিত পুনরাবৃত্ত বাক্য গঠন বাক্যটি অনুসন্ধান করতে চাই এবং এটি এখানে।
রবার্ট আলটম্যান

37
List<String> arrayList = new ArrayList<String>();
for (String s : arrayList) {
    if(s.equals(value)){
        //do something
    }
}

অথবা

for (int i = 0; i < arrayList.size(); i++) {
    if(arrayList.get(i).equals(value)){
        //do something
    }
}

তবে সাবধান থাকুন অ্যারেলিস্ট নাল মান ধরে রাখতে পারে । সুতরাং তুলনা করা উচিত

value.equals(arrayList.get(i))

যখন আপনি নিশ্চিত হন যে মানটি নাল নয় বা প্রদত্ত উপাদানটি নাল কিনা তা আপনার পরীক্ষা করা উচিত।


10

আপনি এটির মতো ব্যবহার করতে পারেন:

for(Iterator iterator = arrayList.iterator(); iterator.hasNext();) {
x = iterator.next();
//do some stuff
}

বিষয়টিকে castালাই এবং ব্যবহার করা এটি একটি ভাল অনুশীলন। উদাহরণস্বরূপ, যদি 'অ্যারেলিস্ট'-এ' অবজেক্ট 1 'অবজেক্টের একটি তালিকা থাকে। তারপরে, আমরা কোডটি আবার লিখতে পারি:

for(Iterator iterator = arrayList.iterator(); iterator.hasNext();) {
x = (Object1) iterator.next();
//do some stuff
}

8

আপনি অ্যারের জন্য যেমন চান তেমন লুপের জন্যও করতে পারেন তবে অ্যারের পরিবর্তে [i] আপনি list.get (i) ব্যবহার করবেন

for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i));
}

7

লারসম্যানের উত্তর (প্রকৃতপক্ষে সঠিক) ব্যতীত গেট () পদ্ধতিতে কল করার ক্ষেত্রে ব্যতিক্রম, সুতরাং আপনার পোস্ট করা কোডটি ত্রুটির কারণ হয়ে উঠছে না।


4

ArrayListএই লিঙ্কটি অনুসরণ করে আপনার পুনরাবৃত্তি করার কার্যকর উপায় । এই ধরণের পুনরাবৃত্তির সময় লুপিংয়ের কার্যকারিতা উন্নত করবে

int size = list.size();

for(int j = 0; j < size; j++) {
    System.out.println(list.get(i));
}

2

পুনরুক্তি ব্যবহার করে পুনরাবৃত্তি ব্যর্থ-নিরাপদ নয় উদাহরণস্বরূপ যদি আপনি পুনরুক্তি তৈরির পরে সংগ্রহের মধ্যে উপাদান যুক্ত করেন তবে এটি সমকালীন মডডফিকেশনটিসেপশন নিক্ষেপ করবে। এছাড়াও এটি থ্রেড নিরাপদ নয়, আপনাকে এটিকে থ্রেড বাইরে থেকে নিরাপদ করতে হবে।

সুতরাং লুপের জন্য প্রতিটি কাঠামোর জন্য ব্যবহার করা ভাল। এটি কমপক্ষে ব্যর্থ-নিরাপদ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.