একটি তালিকায় অন্যটির থেকে উপাদান রয়েছে কিনা তা পরীক্ষা করুন


105

সেগুলিতে বিভিন্ন জিনিস সহ আমার দুটি তালিকা রয়েছে।

List<Object1> list1;
List<Object2> list2;

আমি তালিকা 1 থেকে উপাদানটি নির্দিষ্ট 2 (অজেক্ট 1 এবং অবজেক্ট 2 (অন্যদের মধ্যে), একটি মিউচুয়াল অ্যাট্রিবিউট (লং টাইপযুক্ত, নামযুক্ত অ্যাট্রিবিউটসাম) এর উপর ভিত্তি করে তালিকা 2 তে উপস্থিত কিনা তা পরীক্ষা করতে চাই।

এই মুহুর্তে, আমি এটি এইভাবে করি:

boolean found = false;
for(Object1 object1 : list1){
   for(Object2 object2: list2){
       if(object1.getAttributeSame() == object2.getAttributeSame()){
           found = true;
           //also do something
       }
    }
    if(!found){
        //do something
    }
    found = false;
}

তবে আমি মনে করি এটি করার একটি আরও ভাল এবং দ্রুত উপায় আছে :) কেউ কি এটি প্রস্তাব করতে পারেন?

ধন্যবাদ!


প্রথমত, আপনি যখন সেট করেছেন = সত্য; তারপর কেবল বিরতি; বা লুপ থেকে বেরিয়ে আসুন
jsist

stackoverflow.com/questions/5187888/… । তদুপরি, দ্রুত অনুসন্ধানের জন্য বাইনারি অনুসন্ধান ব্যবহার করে চেষ্টা করুন এবং পরিস্থিতি স্যুট করতে আপনার ডিএস পরিবর্তন করুন ...
jsist

তারা অবজেক্ট ছাড়াও একটি সাধারণ পিতামাতাকে ভাগ করে না?
Woot4Moo

@ Woot4Moo না, তারা করেন না
নেড

উত্তর:


219

আপনার যদি কেবলমাত্র মৌলিক সাম্যতা পরীক্ষা করার প্রয়োজন হয় তবে এটি এক লাইনের ইনপুট তালিকাগুলি পরিবর্তন না করে মৌলিক জেডিকে দিয়ে করা যেতে পারে

!Collections.disjoint(list1, list2);

আপনার যদি কোনও নির্দিষ্ট সম্পত্তি পরীক্ষা করার দরকার হয় তবে এটি আরও শক্ত। আমি ডিফল্ট হিসাবে সুপারিশ করব,

list1.stream()
   .map(Object1::getProperty)
   .anyMatch(
     list2.stream()
       .map(Object2::getProperty)
       .collect(toSet())
       ::contains)

... যা পৃথক মান সংগ্রহ করে list2এবং list1উপস্থিতির জন্য প্রতিটি মান পরীক্ষা করে ।


1
উভয় 2 টি ভিন্ন ভিন্ন বস্তু হওয়ায় এটি কি সর্বদা মিথ্যা ফিরবে না?
ভেঙ্কি

2
উম, না? দুটি সংগ্রহের মধ্যে একে অপরের সমান () সমান না হলে পরীক্ষাগুলি ছিন্ন করুন।
লুই ওয়াসারম্যান

13
এছাড়াও, দয়া করে মনে রাখবেন যে তালিকার জন্য এটি ও (এন * মি) হবে; আপনি যদি তুলনা করার আগে list1একটি অনুলিপি করতে ইচ্ছুক হন তবে আপনি Setও (এন) + ও (এম) অর্থাত্ ও (এন + মি) পাবেন, অতিরিক্ত কিছু র‌্যামের ব্যয় করে; এটি গতি বা মেমরির মধ্যে চয়ন করার বিষয়।
হ্যারল্ডো_ওকে

এটি কেবল "লিস্ট <পার্সন> তালিকা 1; তালিকা <পার্সন> তালিকা 2" তালিকা তৈরি করলে তবে দুটি পৃথক অবজেক্ট বা ডেটাটাইপ যেমন লিস্ট <পার্সন> তালিকা 1 তে নয়; তালিকা <কর্মচারী> list2।
হোয়ামি

অবশ্যই এটি জাফির সেই পরিস্থিতিগুলির জন্য কাজ করবে না, প্রশ্ন জিজ্ঞাসা করা প্রশ্নে, এটি যতক্ষণ না আপনার সঠিক সমান প্রয়োগ হয় ততক্ষণ এটি নিখুঁত কাজ করে। এটাই সব বিষয়!
সৈয়দ সিরাজ উদ্দিন

38

আপনি অ্যাপাচি কমন্স সংগ্রহের ব্যবহারগুলি ব্যবহার করতে পারেন :

if(CollectionUtils.containsAny(list1,list2)) {  
    // do whatever you want
} else { 
    // do other thing 
}  

এটি ধরে নেওয়া হয় যে আপনি আপনার কাস্টম অবজেক্টগুলির জন্য সমান কার্যকারিতাটি যথাযথভাবে ওভারলোড করেছেন।


9
এটি 4 বছর হয়েছে এবং আমি স্পষ্টভাবে প্যাকেজ এবং ফাংশন কল করছি।
Woot4Moo

1
যখন কোনও
জেডিইকের

9
@ ওহসিবি জাভাতে একটি অন্তর্নির্মিত লগারও রয়েছে, আপনার লোকদের নীচে নামানো উচিত যারা লগ 4 জে এবং লগ 4 জ 2 ব্যবহার করার পরামর্শ দিচ্ছেন যখন আপনি সেখানে থাকবেন।
Woot4Moo

1
@ Woot4Moo এটি নির্ভর করে। ওপিএস সমস্যা সমাধানের জন্য লগ 4 জ ব্যবহার করার কোনও কারণ থাকলে ডাউনভোট করার কোনও কারণ নেই। এক্ষেত্রে অ্যাপাচি কমন্সগুলি কেবল 99% উত্তরগুলির মতো অনর্থক ব্লাট হবে যা অ্যাপাচি কমনের পরামর্শ দেয়।
ওহিবি

1
@ ওহসিবি তবে আপনি যদি ইতিমধ্যে অ্যাপাচি কমন্স ব্যবহার করে থাকেন তবে এটি সত্যই ফুলে ওঠে না। এটি একটি ভাল উত্তর ছিল।
vab2048

19

নরেন্দ্রর যুক্তি সংক্ষিপ্ত করতে আপনি এটি ব্যবহার করতে পারেন:

boolean var = lis1.stream().anyMatch(element -> list2.contains(element));

3
এই উত্তরটি প্রশংসিত হয়।
কের্বভভি

আপনি চাইলে এটিকে আরও কিছুটা সংক্ষিপ্ত করতে পারেন:list1.stream().anyMatch(list2::contains);
তারকা

9

নেই এক পদ্ধতি এর Collectionনামে retainAllকিন্তু কিছু না থাকার পার্শ্ব প্রতিক্রিয়া তোমার জন্য রেফারেন্স

এই তালিকার কেবলমাত্র নির্দিষ্ট উপাদানগুলিতে (alচ্ছিক ক্রিয়াকলাপ) অন্তর্ভুক্ত থাকা উপাদানগুলি পুনরুদ্ধার করে। অন্য কথায়, নির্দিষ্ট সংগ্রহটিতে অন্তর্ভুক্ত নেই এমন সমস্ত উপাদানগুলি তালিকা থেকে এই তালিকা থেকে সরিয়ে দেয়।

যদি কলটির ফলাফল হিসাবে এই তালিকাটি পরিবর্তন হয় তবে সত্য

এটা দেখতে

boolean b = list1.retainAll(list2);

5

লোয়াস উত্তরটি সঠিক, আমি কেবল একটি উদাহরণ যুক্ত করতে চাই:

listOne.add("A");
listOne.add("B");
listOne.add("C");

listTwo.add("D");
listTwo.add("E");
listTwo.add("F");      

boolean noElementsInCommon = Collections.disjoint(listOne, listTwo); // true

1
আমি মনে করি আপনি যদি দ্বিতীয় 'এড' উপাদানটিকে দ্বিতীয় তালিকা তালিকায় যোগ করেন তবে দুই.এডিডি ("এ"); যদিও কালেকশন.ডিজয়েন্ট (listOne, listTwo); সত্য ফিরে।
সায়রাম কুকাদালা

2

দ্রুততর পথে অতিরিক্ত স্থানের প্রয়োজন হবে।

উদাহরণ স্বরূপ:

  1. সমস্ত আইটেমকে একটি তালিকায় হ্যাশসেটে রাখুন (অবজেক্ট.জেটআট্রিবিউটসেম ()) ব্যবহারের জন্য আপনাকে নিজের দ্বারা হ্যাশ ফাংশনটি প্রয়োগ করতে হবে

  2. অন্য তালিকার মধ্য দিয়ে যান এবং কোনও আইটেম হ্যাশসেটে রয়েছে কিনা তা পরীক্ষা করে দেখুন।

এইভাবে প্রতিটি বস্তু একবারে একবারে পরিদর্শন করা হয়। এবং হ্যাশসেট ও (1) এ যে কোনও বস্তু চেক বা সন্নিবেশ করানোর জন্য যথেষ্ট দ্রুত is


2

জাভাডকের মতে এর জন্য .contains(Object obj):

যদি এই তালিকায় নির্দিষ্ট উপাদান থাকে তবে সত্য ফিরে আসে। আরও আনুষ্ঠানিকভাবে, সত্য এবং যদি এই তালিকায় কমপক্ষে একটি উপাদান ই থাকে (o == নাল? E == নাল: o.equals (e)) থাকে তবেই সত্যটি ফিরে আসে।

সুতরাং আপনি যদি .equals()আপনার প্রদত্ত বস্তুর জন্য আপনার পদ্ধতিটিকে ওভাররাইড করে থাকেন তবে আপনার তা করতে সক্ষম হওয়া উচিত:if(list1.contains(object2))...

যদি উপাদানগুলি অনন্য হয়ে থাকে (অর্থাত্ পৃথক বৈশিষ্ট্যগুলি থাকে) আপনি এটিকে ওভাররাইড করতে .equals()এবং এতে .hashcode()সমস্ত কিছু সঞ্চয় করতে পারেন HashSets। এটি আপনাকে ধ্রুব সময়ে অন্য কোনও উপাদান রয়েছে কিনা তা পরীক্ষা করতে দেয়।


2

এটি দ্রুত করতে, আপনি একটি বিরতি যোগ করতে পারেন; সত্য হিসাবে সেট করা থাকলে লুপটি থামবে:

boolean found = false;
for(Object1 object1 : list1){
   for(Object2 object2: list2){
       if(object1.getAttributeSame() == object2.getAttributeSame()){
           found = true;
           //also do something  
           break;
       }
    }
    if(!found){
        //do something
    }
    found = false;
}

যদি আপনার কীগুলির বৈশিষ্ট্য হিসাবে একই তালিকার স্থানে মানচিত্র থাকে তবে একই মান হিসাবে, যদি দ্বিতীয় মানচিত্রে সংশ্লিষ্ট মান থাকে বা না থাকে তবে আপনি একটি মানচিত্রে একটি মানের জন্য দ্রুত পরীক্ষা করতে পারেন।


হাই টম, লক্ষ্য করার জন্য ধন্যবাদ! হ্যাঁ, টাইপ করার সময় আমি "বিরতি" ভুলে গিয়েছিলাম। তবে আমি ভাবছিলাম যে এখানে কিছু অ্যালগরিদম আছে, বা আমার এই তালিকাগুলি অন্য কোনও সংগ্রহের মধ্যে পরিবর্তন করা উচিত।
নেড

ও (এন * মি) এর চেয়ে ভাল আর কিছু নেই?
Woot4Moo

.getAttributeSame ()?
মাভেň ツ

অবজেক্ট 1 এবং অবজেক্ট 2 থেকে getAttributeSame () পদ্ধতির বাস্তবায়ন সরবরাহ করা হয় না, তবে প্রশ্নোত্তরের জন্যও প্রাসঙ্গিক নয়; এটি কেবলমাত্র একটি বৈশিষ্ট্য (এট্রিবিউটসেম, একটি দীর্ঘ) প্রদান করে যা উভয় শ্রেণীর রয়েছে।
টম

0

আপনি যে ধরণের ডেটা রেখেছেন তা কি সংজ্ঞায়িত করতে পারেন? এটা কি বড় তথ্য? এটি বাছাই করা হয়? আমি মনে করি যে আপনাকে ডেটার উপর নির্ভর করে বিভিন্ন দক্ষতা পদ্ধতির বিবেচনা করতে হবে।

উদাহরণস্বরূপ, যদি আপনার ডেটাটি বড় এবং অরসোর্টার্ড হয় তবে আপনি চেষ্টা করতে পারেন এবং সূচি অনুসারে দুটি তালিকাকে পুনরাবৃত্তি করতে এবং প্রতিটি তালিকা বৈশিষ্ট্যকে অন্য তালিকা সহায়কতে সঞ্চয় করতে পারেন। তারপরে আপনি সহায়তা তালিকার বর্তমান বৈশিষ্ট্যগুলি পরীক্ষা করে দেখতে পারেন check

শুভকামনা

সম্পাদিত: এবং আমি ওভারলোডিং সমানর প্রস্তাব দেব না। এটি বিপজ্জনক এবং সম্ভবত আপনার অবজেক্টের অর্থের বিরুদ্ধে।



0

এর সাথে java 8, আমরা নীচে নীচের মতো করতে পারি যে একটি তালিকায় অন্য তালিকার কোনও উপাদান রয়েছে কিনা তা পরীক্ষা করতে

boolean var = lis1.stream().filter(element -> list2.contains(element)).findFirst().isPresent();

0

আপনি যদি তালিকায় কোনও উপাদান উপস্থিত আছেন কিনা তা পরীক্ষা করতে চান তবে এই পদ্ধতিটি ব্যবহার করুন।

if (list1.contains(Object o))
{
   //do this
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.