অ্যারেলিস্টক্লিয়ার () এবং অ্যারেলিস্ট.রেমওএল () এর মধ্যে পার্থক্য কী?


283

ধরে নেওয়া যাকে arraylistহিসাবে সংজ্ঞায়িত করা হয় ArrayList<String> arraylist, arraylist.removeAll(arraylist)সমানarraylist.clear() ?

যদি তা হয় তবে আমি কী ধরে নিতে পারি যে clear()অ্যারে তালিকা খালি করার জন্য পদ্ধতিটি আরও দক্ষ?

এর arraylist.removeAll(arraylist)পরিবর্তে কি কোনও সতর্কতামূলক ব্যবহার রয়েছে arraylist.clear()?


এই প্রশ্নের একটি সম্ভাব্য তাত্পর্য: কখন অন্যটির পরিবর্তে একটি ব্যবহার করা যেতে পারে?
কোরি ওগবার্ন

3
@ কোরি: যখন প্রত্যেকে ব্যবহার করতে চাইবে arraylist.removeAll(arraylist)? আমি এটি করার কোনও কারণ দেখছি না।
জোছিম সউর

@ জোয়াচিম সৌর ঠিক এটিই যাচাই করতে চেয়েছিলাম। ধন্যবাদ +২ কিন্তু মধ্যে পার্থক্য elementData[i] = nullএবং e.remove()উল্লেখযোগ্য?
ateiob

এর arrList.removeAll(arrList)পরিবর্তে করার কোনও বুদ্ধিমান কারণ নেই arrList.clear()arrList1.removeAll(arrList2)একটি ভিন্ন বিষয়।
ভ্লাদ

3
যদি কেবল সরানোর সমস্ত () এর প্রয়োগটি এই লাইন দিয়ে শুরু হয়, তবে এই পুরো আলোচনাটি এত বেশি বিনোদনমূলক হতে পারে !!! if (c == this && !isEmpty()) { clear(); return true; }। আমাকে এটি প্যাচ হিসাবে ওপেনজেডিকে জমা দিতে হবে! ;-)
জুলিয়াস মুসাউ

উত্তর:


396

এর জন্য উত্স কোড clear():

public void clear() {
    modCount++;

    // Let gc do its work
    for (int i = 0; i < size; i++)
        elementData[i] = null;

    size = 0;
}

এর জন্য উত্স কোড removeAll()(সংজ্ঞায়িত হিসাবে AbstractCollection):

public boolean removeAll(Collection<?> c) {
    boolean modified = false;
    Iterator<?> e = iterator();
    while (e.hasNext()) {
        if (c.contains(e.next())) {
            e.remove();
            modified = true;
        }
    }
    return modified;
}

clear() এটি এত দ্রুত যেহেতু এটি সমস্ত অতিরিক্ত পদ্ধতি কলগুলির সাথে মোকাবেলা করতে হবে না।

এবং অ্যাট্রি উল্লেখ করেছেন যে, ও (এন 2 ) এর বিপরীতে ও (এন 2 ) c.contains(..)এর সময়ের জটিলতা বৃদ্ধি করে ।removeAllclear


29
একটি নোট যা c.contains(...)অপারেশনের সময় জটিলতার স্কোয়ার করে এই উত্তরটি সম্পূর্ণ করে দেবে।
অ্যাট্রেইস

8
উত্স এই এক শক্তিশালী। (অন্যান্য সমস্ত উত্তরের জন্য: উত্সটি ব্যবহার করুন, লূক) তবে আবর্জনা-সংগ্রহ অ্যারের অ্যাক্সেসযোগ্য অংশে উপাদানগুলি সংগ্রহ করতে জানত না।
জুলিয়াস মুসাউ

2
e.remove () আসলে আরও জটিল! e.remove () c.contains (...) এর মতোই জটিলতাটিকেও স্কোয়ার করে দেয়। একটি অ্যারেলিস্টে, ই। রেমোভ () অ্যারেলিস্ট.রেমোভ (ইনটেক্স ইনডেক্স) কল করে, যা অ্যারের বাকী অংশটিকে একের পর এক স্থানান্তর করতে হয়।
জুলিয়াস মুসাউ

1
@ateiob e.remove () হল দুটি অতিরিক্ত পদ্ধতি কল, একটি পরিসীমা চেক এবং একটি অবজেক্ট রিটার্ন (অভ্যন্তরীণ থেকে AbstractList.Itr.remove()এবং এ)ArrayList.remove(int) )
অ্যাট্রেইস

2
@ জুলিয়াস যদি এটি করে থাকে: size = 0; elementData = new Object[10]; বাকী সমস্ত আবর্জনা সংগ্রহ করা হবে, কারণ ব্যাকিং অ্যারের বাইরের কোনও উল্লেখ নেই।
কর্সিকা

51

সময় জটিলতা ArrayList.clear()হয় O(n)এবং removeAllহয়O(n^2)

হ্যাঁ, ArrayList.clearঅনেক দ্রুত।


15

clear()পদ্ধতি একটি একক সমস্ত উপাদান সরিয়ে ফেলা হবে ArrayList। এটি একটি দ্রুত অপারেশন, কারণ এটি অ্যারে উপাদানগুলিকে কেবল সেট করেnull

যে removeAll(Collection)পদ্ধতিটি উত্তরাধিকার সূত্রে প্রাপ্ত হয়েছে AbstractCollection, আপনি সেই পদ্ধতিটি কল করেছেন সেই সংগ্রহ থেকে আর্গুমেন্ট সংগ্রহের সমস্ত উপাদান সরিয়ে দেয়। এটি তুলনামূলকভাবে ধীর গতি সম্পন্ন অপারেশন, কারণ এতে জড়িত সংগ্রহগুলির মধ্যে একটির মাধ্যমে অনুসন্ধান করতে হবে।


আমি ভেবেছিলাম এটি কেবল সমস্ত কিছু সেট করে, কিছু উপাদান বাতিল করে দেয় না। যদি এটি না হয়, তবে কীভাবে এটি সিদ্ধান্ত নিয়েছে যে কোন উপাদানগুলি বাতিল করা উচিত?
ফরিদ

2
@ ফরিদ দুঃখিত, আমার ইংরেজি এখানে খুব অনানুষ্ঠানিক। আমি প্রকৃতপক্ষে বোঝাতে চাইছি এটি সমস্ত উপাদানকে বাতিল করে দেয়। আমি এটা ঠিক করব!
আর্নেস্ট ফ্রাইডম্যান-হিল

7

যদি না কোনও নির্দিষ্ট অপ্টিমাইজেশন থাকে যা পরীক্ষা করে যদি তর্কটি পাস হয় removeAll()তা সংগ্রহটি নিজেই হয় (এবং আমি অত্যন্ত সন্দেহ করি যে এই ধরনের অপ্টিমাইজেশন রয়েছে) এটি একটি সাধারণের চেয়ে উল্লেখযোগ্যভাবে ধীর হয়ে যাবে.clear()

এগুলি ছাড়াও (এবং কমপক্ষে সমানভাবে গুরুত্বপূর্ণ): arraylist.removeAll(arraylist)হ'ল অবসেস, বিভ্রান্তিকর কোড। "এই সংগ্রহটি সাফ করুন" বলার এটি খুব পিছনের দিক। খুব বোধগম্য হয়ে ওঠার কী সুবিধা হবে arraylist.clear()?


7

তারা বিভিন্ন উদ্দেশ্যে পরিবেশন। clear()শ্রেণীর একটি উদাহরণ সাফ করে, removeAll()প্রদত্ত সমস্ত বস্তু সরিয়ে দেয় এবং ক্রিয়াকলাপের স্থিতি ফিরিয়ে দেয়।


পরবর্তী রেফারেন্সের জন্য আপনি কি দয়া করে উপরোক্ত বিষয়ে পড়ার জন্য একটি সংস্থান সরবরাহ করতে পারেন
কাসুন সায়াম্বলাপিতিয়া

1
@ কাসুনসিয়াম্বলপিটিয়া গৃহীত উত্তর সম্পর্কে কীভাবে , যার মধ্যে দুজনের উত্স কোড রয়েছে?
আব্দুল

5

clear() অন্তর্নিহিত অ্যারের মধ্য দিয়ে যাবে এবং প্রতিটি এন্ট্রি বাতিল করে দেবে;

removeAll(collection) সংগ্রহের জন্য অ্যারেলিস্ট চেকিংয়ের মাধ্যমে যাবেন এবং remove(Object) এটি বিদ্যমান থাকলে।

আমি কল্পনা করব যে clear()এটি দ্রুততর হয় তবে সমস্ত অপসারণ করুন কারণ এটি তুলনা হয় না, ইত্যাদি etc.


2

সাফ দ্রুততর কারণ এটি মোছার জন্য উপাদানগুলির উপর লুপ করে না। এই পদ্ধতিটি ধরে নিতে পারে যে সমস্ত উপাদান মুছতে পারে।

Remove allঅগত্যা তালিকার সমস্ত উপাদান মুছে ফেলা উচিত নয়, কেবলমাত্র পরামিতি হিসাবে সরবরাহ করা মুছে ফেলা উচিত। সুতরাং, যেগুলি মুছে ফেলা উচিত নয় সেগুলি রাখার জন্য আরও প্রচেষ্টা প্রয়োজন।

শোধন

'লুপ' দ্বারা, এর অর্থ উপাদানটি রাখা উচিত কিনা তা পরীক্ষা করে দেখার দরকার নেই। এটি nullমুছতে উপাদানগুলির সরবরাহিত তালিকাগুলি অনুসন্ধান না করে রেফারেন্স সেট করতে পারে।

Clearচেয়ে দ্রুত deleteall


1
আমি বেশ নিশ্চিত যে ArrayList.clear()এটি লুপ করতে হবে।
জোছিম সউর

@ জেভেরস্ট্রি আপনি কী বোঝাতে চাইছেন যে পরিষ্কার () অ্যারেলিস্ট থেকে সরানো উপাদানগুলি মুছবে না ?
ateiob

1
ভুল, ক্লিয়ারটি অভ্যন্তরীণ অ্যারের উপরে লুপ করে এবং আবর্জনা সংগ্রহকারীকে তার কাজটি করতে দেয় তার জন্য সমস্ত রেফারেন্স শূন্য করে দেয়।
ডিভকনসোল

1
@ জোয়াচিম, @ দেডকনসোল: আমি মনে করি তিনি বোঝাতে চেয়েছিলেন যে এটি প্যারামিটার হিসাবে দেওয়া তালিকার উপরে লুপ / ​​পুনরাবৃত্তি করতে হবে না। target.removeAll(param)পুনরাবৃত্তি হবে paramএবং তারপরে কল করবে target.contains(...)যা পুনরাবৃত্তি করবে target
ভ্লাদ

2
-3 কিছুটা কঠোর। জেভেরস্ট্রি চাইলে তিনি স্ক্র্যাচ থেকে নিজের জাভা প্রয়োগটি লিখতে পারেন যা লুপ হয়নি। ক্লিয়ার () কার্যকরভাবে ল (ল) ছাড়াই ও (1) এ প্রয়োগ করা যেতে পারে, যেখানে সরানআল () এর কিছু প্রকার ও (এন) অ্যালগরিদম থাকতে হবে, সমস্ত উপাদানগুলি পরীক্ষা না করেই সরানোর সমস্ত () এপিআইয়ের চুক্তি পূরণ করার উপায় নেই।
জুলিয়াস মুসাউ

1

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


-8

অ্যারে => একবার রান সময়ে অ্যারে ভেরিয়েবলের জন্য স্থান বরাদ্দ হয়ে গেলে বরাদ্দ স্থানটি বাড়ানো বা সরানো যায় না।

অ্যারেলিস্ট => অ্যারেলিস্টে এটি হয় না। অ্যারেলিস্ট রান সময়টিতে বৃদ্ধি এবং সঙ্কুচিত হতে পারে। বরাদ্দকৃত স্থানটি রান সময়ে ন্যূনতম বা সর্বোচ্চ করা যায় ized


এটি অ্যারেলিস্টক্লায়ার () এবং অ্যারেলিস্ট.রেমোভাল সমস্ত () এর মধ্যে যে পার্থক্য তা প্রশ্নের উত্তর দেয় না, একটি অ্যারে এবং অ্যারেলিস্টের মধ্যে পার্থক্য নয়।
পিয়েরে

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