একটি তালিকা <ইন্টিজার> থেকে সঠিকভাবে একটি পূর্ণসংখ্যা অপসারণ


201

আমি সবেমাত্র মুখোমুখি হয়েছি এমন একটি দুর্দান্ত ক্ষতি পূর্ণসংখ্যার একটি তালিকা বিবেচনা করুন:

List<Integer> list = new ArrayList<Integer>();
list.add(5);
list.add(6);
list.add(7);
list.add(1);

আপনি মৃত্যুদন্ড কার্যকর করার পরে কি ঘটবে এ সম্পর্কে কোনও শিক্ষিত অনুমান list.remove(1)? কি হবে list.remove(new Integer(1))? এটি কিছু বাজে বাগের কারণ হতে পারে।

পূর্ণসংখ্যার তালিকাগুলির সাথে লেনদেন করার সময়, কোনটি remove(int index)নির্দিষ্ট সূচক থেকে কোনও উপাদানকে সরিয়ে দেয় এবং remove(Object o)কোন উপাদানকে রেফারেন্স দ্বারা সরিয়ে দেয়, তার মধ্যে পার্থক্য করার যথাযথ উপায় কী ?


এখানে বিবেচনা করার মূল বিষয়টি হ'ল @ নিকিতা যা উল্লেখ করেছেন - সঠিক প্যারামিটারের মিলটি অটো-বক্সিংয়ের চেয়ে বেশি প্রাধান্য পায়।


11
উত্তর: এখানে আসল বিষয়টি হ'ল সূর্যের মধ্যে কেউ কেউ আধ্যাত্মিক চারপাশে (অপরিবর্তনীয়) মোড়কের ক্লাসগুলি স্মার্ট বলে মনে করেছিলেন এবং পরে কেউ ভাবেন যে অটো- (আন) বক্সিং করা এমনকি বুদ্ধিমান ... এবং লোকেরা ল্যাম্প ডিফল্ট এপিআই ব্যবহার করে রাখে যখন ভালো ব্যক্তিরা উপস্থিত । অনেকগুলি উদ্দেশ্যে নতুন অ্যারেলিস্ট <Integer> এর চেয়ে আরও ভাল সমাধান রয়েছে । উদাহরণস্বরূপ ট্রভ জিনিসগুলি একটি TIntArrayList সরবরাহ করে । জাভাতে আমি যত বেশি প্রোগ্রাম করি (2001 এর পরে এসসিজেপি), আমি কম পরিমাণে র‌্যাপার ক্লাস ব্যবহার করি এবং তত বেশি আমি ভাল-ডিজাইন করা API গুলি ব্যবহার করি (ট্রভ, গুগল ইত্যাদি মনে পড়ে)।
সিনট্যাক্স T3rr0r

উত্তর:


230

জাভা সর্বদা সেই পদ্ধতিকে কল করে যা আপনার যুক্তিকে সবচেয়ে উপযুক্ত করে। কাস্টিং / অটো বক্সিং ছাড়া কল করা যায় এমন কোনও পদ্ধতি না থাকলে কেবল অটো বক্সিং এবং অন্তর্নিহিত আপসকাস্টিং সঞ্চালিত হয়।

তালিকা ইন্টারফেস দুটি অপসারণের পদ্ধতি নির্দিষ্ট করে (দয়া করে যুক্তির নাম উল্লেখ করুন):

  • remove(Object o)
  • remove(int index)

এর অর্থ হ'ল list.remove(1)পজিশনে অবস্থিত বস্তুটি remove(new Integer(1))সরিয়ে ফেলবে এবং এই তালিকা থেকে নির্দিষ্ট উপাদানের প্রথম উপস্থিতি সরিয়ে ফেলবে।


110
একটি নিট বাছাই: Integer.valueOf(1)তুলনায় ভাল অনুশীলন new Integer(1)। স্থিতিশীল পদ্ধতি ক্যাচিং এবং এগুলি করতে পারে, যাতে আপনি আরও ভাল পারফরম্যান্স পাবেন।
ডিক্রিটগ করুন

পিটার লরির প্রস্তাব ভাল এবং অযৌক্তিক অবজেক্ট তৈরিগুলি এড়িয়ে চলে।
Assylias

@ এ্যাসিয়ালিয়াস: পিটার লরির প্রস্তাবটি ডিকিট্রিজের প্রস্তাব মতো ঠিক একই কাজ করেছে, কেবল স্বচ্ছভাবে।
মার্ক পিটার্স

@ মার্কপিটার্স আমার মন্তব্য সম্পর্কে ছিল new Integer(1), কিন্তু আমি সম্মত Integer.valueOf(1)বা (Integer) 1সমতুল্য।
অ্যাসিলিয়াস

68

আপনি ingালাই ব্যবহার করতে পারেন

list.remove((int) n);

এবং

list.remove((Integer) n);

এন কোনও আন্ত বা পূর্ণসংখ্যা কিনা তা বিবেচ্য নয়, পদ্ধতিটি সর্বদা আপনার প্রত্যাশাকে কল করবে।

ব্যবহার (Integer) nবা Integer.valueOf(n)অধিক কার্যকরী হয় new Integer(n)যেমন প্রথম দুই যেহেতু পরে সবসময় একটি বস্তু তৈরি করবে, পূর্ণসংখ্যা ক্যাশে ব্যবহার করতে পারেন।


2
এটির কারণটি যদি আপনি ব্যাখ্যা করতে পারেন তবে খুব ভাল লাগবে :) [অটোবক্সিং শর্ত ...]
যুবাল অ্যাডাম

Ingালাই ব্যবহার করে, আপনি নিশ্চিত করে যে সংকলকটি আপনার প্রত্যাশিত প্রকারটি দেখে। প্রথম ক্ষেত্রে '(int- এ) এন' শুধুমাত্র ধরনের হতে পারে int- এ দ্বিতীয় ক্ষেত্রে '(পূর্ণসংখ্যা) এন' একমাত্র ধরনের হতে পারে পূর্ণসংখ্যা । 'এন' প্রয়োজনীয় হিসাবে রূপান্তরিত / বাক্সড / আনবক্সড হবে বা আপনি এটি না পারলে একটি সংকলক ত্রুটি পাবেন।
পিটার লরি

10

আমি 'সঠিক' উপায় সম্পর্কে জানি না, তবে আপনি যেভাবে পরামর্শ দিয়েছেন তা ঠিক কাজ করে:

list.remove(int_parameter);

প্রদত্ত অবস্থানে উপাদান সরিয়ে দেয় এবং

list.remove(Integer_parameter);

তালিকা থেকে প্রদত্ত বস্তু সরান।

কারণ পদ্ধতি এটি প্রথম প্রচেষ্টা এ VM- র ঘোষিত এটা ঠিক একই প্যারামিটার প্রকার এবং শুধুমাত্র তারপর autoboxing চেষ্টা করে।


7

list.remove(4)এটি হুবহু মিল list.remove(int index), তাই এটি বলা হবে। আপনি কি কলটি করতে চান list.remove(Object): নিম্নোক্ত কাজ list.remove((Integer)4)


থ্যাঙ্কস পেটর, (Integer)আপনার মতো উপরে লেখা সহজ কাস্টটি আমার কাছে সবচেয়ে সহজ পদ্ধিতি বলে মনে হচ্ছে।
ভাইকিংস্টিভ

আপনার শেষ পদ্ধতির ব্যবহার করার সময়, মনে হয় এটি একটি বুলিয়ান ফিরে আসবে। একাধিক সরানো স্ট্যাক করার চেষ্টা করার সময় আমি ত্রুটিটি পাই যা আমি বুলিয়ান থেকে অপসারণ কল করতে পারি না।
ব্রাম ভ্যানরোয়

4

আপনি তালিকাটি কার্যকর করেন তখন কি ঘটে যায় সে সম্পর্কে কোনও শিক্ষিত অনুমান (1)? তালিকা সম্পর্কে কি বলা যায় (নতুন পূর্ণসংখ্যা (1))?

অনুমান করার দরকার নেই। প্রথম কেসের কল করার ফলস্বরূপ ঘটবে List.remove(int)এবং অবস্থানের উপাদানটি 1সরানো হবে। দ্বিতীয় কেসটির ফলস্বরূপ List.remove(Integer)বলা হবে এবং যে উপাদানটির মান সমান Integer(1)সেগুলি সরানো হবে। উভয় ক্ষেত্রেই, জাভা সংকলক নিকটতম মিলে যাওয়া ওভারলোড নির্বাচন করে।

হ্যাঁ, এখানে বিভ্রান্তির (এবং বাগগুলি) সম্ভাবনা রয়েছে তবে এটি মোটামুটি অস্বাভাবিক ব্যবহারের ক্ষেত্রে।

দুটি List.removeপদ্ধতি যখন জাভা ১.২ এ সংজ্ঞায়িত করা হয়েছিল, তখন ওভারলোডগুলি অস্পষ্ট নয়। সমস্যাটি কেবল জাভা 1.5 তে জেনারিক এবং অটোবক্সিং প্রবর্তনের সাথে সাথে উদ্ভূত হয়েছিল। পূর্বের দৃষ্টিতে, অপসারণের পদ্ধতির মধ্যে একটির আলাদা নাম দেওয়া থাকলে এটি আরও ভাল হত। তবে এখন অনেক দেরি হয়ে গেছে।


2

মনে রাখবেন যে ভিএম সঠিক কাজটি না করে, যা এটি করে, আপনি এখনও remove(java.lang.Object)স্বেচ্ছাসেবী বস্তুগুলিতে পরিচালনা করে এমন তথ্য ব্যবহার করে যথাযথ আচরণ নিশ্চিত করতে পারেন :

myList.remove(new Object() {
  @Override
  public boolean equals(Object other) {
    int k = ((Integer) other).intValue();
    return k == 1;
  }
}

এই "সমাধান" equalsপদ্ধতির চুক্তিটি ভঙ্গ করে , বিশেষত (জাভাদোক থেকে) "এটি প্রতিসম: কোনও নন-নাল রেফারেন্স মানগুলির জন্য x.equals (y) যদি সত্যই ফিরে আসে এবং শুধুমাত্র যদি y.equals ( এক্স) সত্য ফিরে। এর সমস্ত বাস্তবায়নের ক্ষেত্রে এটির কাজ করার গ্যারান্টি নেই List, কারণ তালিকার কোনও প্রয়োগের ক্ষেত্রে x এবং y x.equals(y)ইচ্ছামতো অদলবদল করার অনুমতি রয়েছে , যেহেতু জাভাডোক Object.equalsবলেছেন যে এটি বৈধ হওয়া উচিত।
এরউইন বোলভিড

1

সহজভাবে আমি গৃহীত উত্তর প্রথম মন্তব্যে # ডিসিট্রিগ্রের পরামর্শ অনুসারে নিম্নলিখিতগুলি পছন্দ করি।

list.remove(Integer.valueOf(intereger_parameter));

এটি আমাকে সাহায্য করেছিল। আপনার মন্তব্যের জন্য আবার # ডিসিট্রিট ধন্যবাদ। এটি কারওর জন্য সাহায্য করতে পারে।


0

ভাল এখানে কৌশল।

এখানে দুটি উদাহরণ নেওয়া যাক:

public class ArrayListExample {

public static void main(String[] args) {
    Collection<Integer> collection = new ArrayList<>();
    List<Integer> arrayList = new ArrayList<>();

    collection.add(1);
    collection.add(2);
    collection.add(3);
    collection.add(null);
    collection.add(4);
    collection.add(null);
    System.out.println("Collection" + collection);

    arrayList.add(1);
    arrayList.add(2);
    arrayList.add(3);
    arrayList.add(null);
    arrayList.add(4);
    arrayList.add(null);
    System.out.println("ArrayList" + arrayList);

    collection.remove(3);
    arrayList.remove(3);
    System.out.println("");
    System.out.println("After Removal of '3' :");
    System.out.println("Collection" + collection);
    System.out.println("ArrayList" + arrayList);

    collection.remove(null);
    arrayList.remove(null);
    System.out.println("");
    System.out.println("After Removal of 'null': ");
    System.out.println("Collection" + collection);
    System.out.println("ArrayList" + arrayList);

  }

}

এবার আউটপুটটি একবার দেখে নেওয়া যাক:

Collection[1, 2, 3, null, 4, null]
ArrayList[1, 2, 3, null, 4, null]

After Removal of '3' :
Collection[1, 2, null, 4, null]
ArrayList[1, 2, 3, 4, null]

After Removal of 'null': 
Collection[1, 2, 4, null]
ArrayList[1, 2, 3, 4]

এখন আউটপুট বিশ্লেষণ করা যাক:

  1. 3 সংগ্রহ থেকে অপসারণ করা হয় এটি পরামিতি হিসাবে remove()গ্রহণ সংগ্রহের পদ্ধতি কল করে Object o। সুতরাং এটি বস্তুটি সরিয়ে দেয় 3। কিন্তু অ্যারেলিস্ট অবজেক্টে এটি সূচক 3 দ্বারা ওভাররাইড করা হয় এবং তাই চতুর্থ উপাদানটি সরানো হয়।

  2. একই লজিক অবজেক্ট দ্বারা অপসারণ নাল দ্বিতীয় ক্ষেত্রে আউট উভয় ক্ষেত্রে মুছে ফেলা হয়।

সুতরাং 3একটি বস্তু সংখ্যাটি অপসারণ করতে আমাদের স্পষ্টভাবে একটি হিসাবে 3 পাস করতে হবে object

এবং এটি মোড়ক ক্লাস ব্যবহার করে ingালাই বা মোড়ানো দ্বারা করা যেতে পারে Integer

উদাহরণ:

Integer removeIndex = Integer.valueOf("3");
collection.remove(removeIndex);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.