অ্যারেলিস্ট থেকে আইটেম সরান


100

আমার ArrayListমনে হয় list, এবং এটিতে আটটি আইএইচ রয়েছে এবং এখন আমি listকীভাবে এটি করতে পারি তা থেকে ইনট অ্যারেতে সঞ্চিত 1,3,5 অবস্থানের আইটেমটি মুছতে চাই ।

আমি এটি দিয়ে চেষ্টা করার চেষ্টা করছি

ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
list.add("F");
list.add("G");
list.add("H");

int i[] = {1,3,5};

for (int j = 0; j < i.length; j++) {
    list.remove(i[j]);
}

তবে প্রথম আইটেমটি মুছে ফেলার পরে অ্যারের অবস্থান পরিবর্তন করা হয় এবং পরবর্তী পুনরাবৃত্তিতে এটি ভুল উপাদানটিকে মুছে দেয় বা ব্যতিক্রম দেয়।


সূচকের উত্থানের ক্রমে এটি অপসারণ সম্পর্কে কীভাবে (সূচকগুলি সাজান, তারপরে উপাদানটি সর্বাধিক সূচকে সরিয়ে ফেলুন)?
nhahtdh

1
আপনার যুক্তি ত্রুটিযুক্ত। অবশ্যই আপনার প্রতিটি আইটেমের অবস্থান সম্পর্কে চিন্তা করা উচিত নয় বরং পরিবর্তে আইটেমগুলি নিজেরাই ভাবা উচিত। অন্য কথায়, আপনি অবস্থানের 1, 3 ও 5 অপসারণ করতে চাই না কিন্তু এর পরিবর্তে আপনি আইটেমগুলি সরানোর (যেখানেই থাকুন না কেন তারা চান List) ব্যবহার করে equals("B"), equals("D")এবং equals("F")। চিন্তা করুন.
স্কোনঙ্ক

হ্যাঁ আমি আইটেমটি মুছতে চাই তবে আমি কীভাবে আইটেমগুলি মেলে পারি। প্রকৃতপক্ষে বাস্তবে এই আইটেমগুলি তালিকাটি দেখুন এবং নির্বাচনের জন্য আমি এটি ডিবি এবং অ্যারে থেকে মুছে ফেলতে এবং অ্যাডাপ্টার এবং তালিকাটি রিফ্রেশ করতে চাই
কৃষ্ণকান্ত দালাল

ধীরে ধীরে বিকল্প: একবারে দ্বিতীয় তালিকায় উপাদানগুলি যুক্ত করে পুনরাবৃত্তি করুন, প্রথম থেকে সরানো দ্বিতীয় তালিকার পুনরাবৃত্তি করুন (
alচ্ছিক

উত্তর:


133

এই নির্দিষ্ট ক্ষেত্রে , আপনাকে অবতরণ ক্রমে উপাদানগুলি সরিয়ে ফেলা উচিত। প্রথম সূচক 5, তারপর 3, তারপর 1। এটি অবাঞ্ছিত পার্শ্ব প্রতিক্রিয়া ছাড়াই তালিকা থেকে উপাদানগুলি সরিয়ে ফেলবে।

for (int j = i.length-1; j >= 0; j--) {
    list.remove(i[j]);
}

1
ওপি'র অ্যারেলিস্টে Stringএস নয়, এস রয়েছে Integer(তবে, আমি আপনার পর্যবেক্ষণের সাথে একমত)।
অ্যালেক্স লকউড

@ অ্যালেক্স: এই উত্তরটি কার্যকর হবে তবে এটি তাদের প্রশ্নের ওপির যুক্তির মতোই ত্রুটিযুক্ত। আমরা এই বিষয়ে কথা বলছি ArrayList<E>- কেন কেউ কেন ArrayListসেই অবস্থানে রয়েছে তা পরীক্ষা করার পরিবর্তে কোনও অবস্থানের উপর ভিত্তি করে নিখুঁত অবস্থান থেকে সরাতে চাইবে কেন ? ওপিতে এটির Stringজন্য অবজেক্টের ধরণ হিসাবে ভালভাবে ব্যবহার করা যেতে পারে ArrayListতবে আপনার উত্তরটি জেনারিকদের জন্য সত্যই খারাপ কোডিং অনুশীলন এমনকি এটি যদি ওপির নির্দিষ্ট পরিস্থিতির সমাধান না করে।
স্কোনঙ্ক

3
হ্যা আমি আপনার সাথে একমত. তবে ওপি জিজ্ঞাসা করেছিল ArrayList<String>, তা নয় ArrayList<E>
অ্যাড্রিয়ান সন্ন্যাস

আমি এই উত্তরটির সাথে সম্পূর্ণরূপে একমত নই, @ মিস্টারস্কোঙ্ক আপনি নিশ্চিত, সমাধান অবশ্যই জেনেরিক হতে হবে। তবুও কেন আমি ডাউনটাতে যাচ্ছি?
মোহাম্মদ আজহারউদ্দিন শাইখ

66
ঠিক আছে, শোনো ... আমি জানি না বড় জিনিসটি কী। ওপি তার কোড পোস্ট করেছে এবং আমি একটি উত্তর দিয়ে উত্তর দিয়েছি যা একটি সম্ভাব্য স্থির চিত্রণ করেছে। আমি দুঃখিত আমি সম্পূর্ণ সাধারণ সমাধান দিয়ে উপরে ওপারে যাইনি ... তবে যতদূর আমি বলতে পারি, ওপি প্রোগ্রামিং পাঠের জন্য জিজ্ঞাসা করছিল না। তিনি জিজ্ঞাসা করছিলেন "কেন এই কোডটি কাজ করছে না?" আপনার প্রশ্নের উত্তর-ভোট দেওয়ার জন্য আমাকে দোষ দেওয়া শুরু করবেন না কারণ আপনি প্রশ্নটিকে অন্যভাবে ব্যাখ্যা করেছেন।
অ্যালেক্স লকউড

30

আপনি উপাদানগুলি ArrayListব্যবহার থেকে অপসারণ করতে পারেন ListIterator,

ListIterator listIterator = List_Of_Array.listIterator();

 /* Use void remove() method of ListIterator to remove an element from List.
     It removes the last element returned by next or previous methods.
 */
listIterator.next();

//remove element returned by last next method
listIterator.remove();//remove element at 1st position
listIterator.next();
listIterator.next();
listIterator.remove();//remove element at 3rd position
listIterator.next();
listIterator.next();
listIterator.remove();//remove element at 5th position

জাভা থেকে সংগ্রহ থেকে বস্তু অপসারণের জন্য তালিকাIterator অপসারণ () পদ্ধতিটি ব্যবহার করা এর আরও ভাল এবং ভাল অনুশীলন, কারণ অন্য থ্রেড একই সংগ্রহটিকে সংশোধন করছে এবং কনকোর্নোমডিফিকেশন এক্সসেপশন বাড়ে হতে পারে এমন সম্ভাবনা থাকতে পারে।
মিনি 2

10
 public void DeleteUserIMP(UserIMP useriamp) {
       synchronized (ListUserIMP) {
            if (ListUserIMP.isEmpty()) {
            System.out.println("user is empty");
        }  else {
            Iterator<UserIMP> it = ListUserIMP.iterator();
            while (it.hasNext()) {
                UserIMP user = it.next();
                if (useriamp.getMoblieNumber().equals(user.getMoblieNumber())) {
                    it.remove();
                    System.out.println("remove it");
                }
            }
            // ListUserIMP.remove(useriamp);

            System.out.println(" this user removed");
        }
        Constants.RESULT_FOR_REGISTRATION = Constants.MESSAGE_OK;
        // System.out.println("This user Deleted " + Constants.MESSAGE_OK);

    }
}

7

যেমনটা পূর্বে বর্ণিত

iterator.remove()

লুপের সময় তালিকার আইটেমগুলি সরিয়ে ফেলার একমাত্র নিরাপদ উপায়।

পুনরুক্তিকারী ব্যবহার করে আইটেমগুলি সরানোর আরও গভীর বোঝার জন্য, এই থ্রেডটি দেখার চেষ্টা করুন


আমি কোন আপত্তি নেই, আমি আপনার সাথে সম্পূর্ণ একমত। এটি এটি করার একটি নিরাপদ উপায়।
সিম্মেন্ট

3

আমি ধরে নিলাম যে অ্যারেটি আমি আরোহণ করা হয়েছে তা সাজানো হয়েছে, এখানে আইট্রেটারের সাথে আরও একটি সমাধান দেওয়া হয়েছে, এটি আরও জেনেরিক:

ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
list.add("F");
list.add("G");
list.add("H");

int i[] = {1,3,5};

Iterator<String> itr = list.iterator();
int pos = 0;
int index = 0;
while( itr.hasNext() ){
    itr.next();
    if( pos >= i.length ){
        break;
    }
    if( i[pos] == index ){
        itr.remove();
        pos++;
    }

    index++;
}

2

এ কেমন? শুধু এটি একটি চিন্তা-

import java.util.ArrayList;

class Solution
{
        public static void main (String[] args){

             ArrayList<String> List_Of_Array = new ArrayList<String>();
             List_Of_Array.add("A");
             List_Of_Array.add("B");
             List_Of_Array.add("C");
             List_Of_Array.add("D");
             List_Of_Array.add("E");
             List_Of_Array.add("F");
             List_Of_Array.add("G");
             List_Of_Array.add("H");

             int i[] = {1,3,5};

             for (int j = 0; j < i.length; j++) {
                 List_Of_Array.remove(i[j]-j);
             }

             System.out.println(List_Of_Array);

        }


}

এবং আউটপুট ছিল-

[A, C, E, G, H]

2

এভাবে চেষ্টা করে দেখুন,

ArrayList<String> List_Of_Array = new ArrayList<String>();
List_Of_Array.add("A");
List_Of_Array.add("B");
List_Of_Array.add("C");
List_Of_Array.add("D");
List_Of_Array.add("E");
List_Of_Array.add("F");
List_Of_Array.add("G");
List_Of_Array.add("H");

int i[] = {5,3,1};

for (int j = 0; j < i.length; j++) {
    List_Of_Array.remove(i[j]);
}


2

আপনি যদি "=" ব্যবহার করেন তবে দ্বিতীয়টির মূল অ্যারেলিস্টের জন্য একটি প্রতিলিপি তৈরি করা হবে, তবে রেফারেন্সটি একই রকম তাই আপনি যদি একটি তালিকায় পরিবর্তন করেন তবে অন্যটিও সংশোধিত হবে। এটি "=" এর পরিবর্তে ব্যবহার করুন

        List_Of_Array1.addAll(List_Of_Array);

2

অ্যারেলিস্টের মুছে ফেলা (ইনড ইনডেক্স) পদ্ধতি তালিকার নির্দিষ্ট অবস্থানে (সূচক) এ উপাদানটি সরিয়ে দেয়। অ্যারেলিস্ট আইটেমগুলি সরানোর পরে পরবর্তী কোনও উপাদানগুলি বামে স্থানান্তরিত করে।

মানে যদি কোনও অ্যারেলিস্টে {20,15,30,40} থাকে

আমি পদ্ধতিটি বলেছি: অ্যারেলিস্ট.ম্রেভ (1)

তারপরে 15 ডেটা মুছে ফেলা হবে এবং 30 এবং 40 এই দুটি আইটেম 1 দ্বারা স্থানান্তরিত হবে।

এই কারণে আপনাকে প্রথমে অ্যারেলিস্টের উচ্চতর সূচক আইটেমটি মুছতে হবে।

সুতরাং..আপনার প্রদত্ত পরিস্থিতির জন্য .. কোডটি হবে ..

ArrayList<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
list.add("F");
list.add("G");
list.add("H");

int i[] = {1,3,5};

for (int j = i.length-1; j >= 0; j--) {
    list.remove(i[j]);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.