আমি এই উত্তরগুলি একটি কৌশল মিস্ বলব।
ব্লচ তার প্রয়োজনীয়, দুর্দান্ত, সংক্ষিপ্ত কার্যকর জাভাতে বলেছেন, আইটেম 47-এ শিরোনাম "লাইব্রেরিগুলি জেনে নিন এবং ব্যবহার করুন", "সংক্ষেপে জানাতে, চাকাটি পুনরায় উদ্ভাবন করবেন না" title এবং না কেন তিনি বেশ কয়েকটি স্পষ্ট কারণ দিয়েছেন।
এখানে কয়েকটি উত্তর রয়েছে যা CollectionUtils
অ্যাপাচি কমন্স সংগ্রহের পাঠাগার থেকে পদ্ধতিগুলি নির্দেশ করে তবে এই প্রশ্নের উত্তর দেওয়ার সবচেয়ে সুন্দর, মার্জিত উপায় কেউ খুঁজে পায়নি :
Collection<Object> culprits = CollectionUtils.disjunction( list1, list2 );
if( ! culprits.isEmpty() ){
// ... do something with the culprits, i.e. elements which are not common
}
দোষী : অর্থাৎ যে উপাদানগুলি উভয়ের পক্ষে সাধারণ নয় Lists
। কোন অপরাধী কোনটির সাথে সম্পর্কিত list1
এবং কোনটি list2
অপেক্ষাকৃত সহজবোধ্য ব্যবহার CollectionUtils.intersection( list1, culprits )
এবং তা নির্ধারণ করা CollectionUtils.intersection( list2, culprits )
।
তবে এটি a "ক", "ক", "বি"} এর disjunction
সাথে a "ক", "বি", "বি" cases এর মতো ক্ষেত্রে বিচ্ছিন্ন হয়ে পড়েছে ... এটি বাদে সফ্টওয়্যারটির ব্যর্থতা নয়, তবে পছন্দসই কাজের সূক্ষ্মতা / অস্পষ্টতার প্রকৃতির সহজাত।
অ্যাপাচি ইঞ্জিনিয়ারদের দ্বারা উত্পাদিত হিসাবে আপনি এই জাতীয় কাজের জন্য সর্বদা উত্স কোড (l। 287) পরীক্ষা করতে পারেন । তাদের কোড ব্যবহার করার একটি সুবিধা হ'ল এটি অনেকগুলি প্রান্তের কেস এবং প্রত্যাশিত এবং মোকাবেলা করা সহ পুরোপুরি বিচার ও পরীক্ষা করা হবে। আপনি যদি প্রয়োজন হয় তবে এই কোডটি আপনার হৃদয়ের সামগ্রীতে অনুলিপি করতে পারেন এবং কপি করতে পারেন।
এনবি আমি প্রথমে হতাশ হয়ে পড়েছিলাম যে কোনও CollectionUtils
পদ্ধতিরই আপনাকে নিজের চাপ প্রয়োগ করতে সক্ষম করার জন্য একটি ওভারলোডেড সংস্করণ সরবরাহ করে না Comparator
(যাতে আপনি নিজের equals
উদ্দেশ্য অনুসারে পুনরায় সংজ্ঞা দিতে পারেন)।
কিন্তু সংগ্রহগুলি ৪.৪ থেকে একটি নতুন শ্রেণি রয়েছে, Equator
যা "টাইপের টির মধ্যে সমতা নির্ধারণ করে"। সংগ্রহসমূহ 4 সংগ্রহের উত্স কোড পরীক্ষা করার সময় তারা মনে করে যে এটি কিছু পদ্ধতিতে ব্যবহার করছে তবে যতদূর আমি এটি তৈরি করতে পারি, CardinalityHelper
ক্লাসটি ব্যবহার করে ফাইলের শীর্ষে থাকা পদ্ধতিগুলির জন্য এটি প্রযোজ্য নয় ... যা অন্তর্ভুক্ত disjunction
এবং intersection
।
আমি অবাক করে দিয়েছি যে অ্যাপাচি লোকেরা এখনও এটিকে ঘৃণ্য নয় কারণ এটি একটি তুচ্ছ নয়: আপনাকে একটি "অ্যাবস্ট্রাক্টএকটিং কোলেকশন" শ্রেণীর মতো কিছু তৈরি করতে হবে যা এর উপাদানগুলির সহজাত equals
এবং hashCode
পদ্ধতিগুলি ব্যবহার না করে পরিবর্তে সেগুলি ব্যবহার করতে হবে এর Equator
যেমন সব মৌলিক পদ্ধতিগুলির জন্য add
, contains
ইত্যাদি বিশেষ দ্রষ্টব্য আসলে যখন আপনি সোর্স কোড তাকান, AbstractCollection
বাস্তবায়ন নেই add
, কিংবা যেমন তার বিমূর্ত উপশ্রেণী না AbstractSet
... আপনি যেমন কংক্রিট শ্রেণীর পর্যন্ত অপেক্ষা করতে হবে HashSet
এবং ArrayList
সামনে add
বাস্তবায়িত হয়. বেশ মাথা ব্যথা।
মাঝামাঝি সময়ে এই স্থানটি দেখুন, আমার ধারণা। সুস্পষ্ট অন্তর্বর্তীকালীন সমাধানটি হ'ল আপনার সমস্ত উপাদানগুলিকে একটি বেসপোক র্যাপার ক্লাসে আবদ্ধ করা যা আপনি ব্যবহার করেন equals
এবং hashCode
যে ধরণের সাম্যতা আপনি চান তা প্রয়োগ করতে ... তারপরে Collections
এই মোড়কজাতীয় বস্তুগুলি ব্যবহার করে।