দুটি সেট মধ্যে পার্থক্য পেয়ে


161

সুতরাং আমার যদি দুটি সেট থাকে:

Set<Integer> test1 = new HashSet<Integer>();
test1.add(1);
test1.add(2);
test1.add(3);

Set<Integer> test2 = new HashSet<Integer>();
test2.add(1);
test2.add(2);
test2.add(3);
test2.add(4);
test2.add(5);

তাদের সাথে তুলনা করার কোনও উপায় কি কেবল 4 এবং 5 এর সেট ফিরে এসেছে?



11
এটি হুবহু সদৃশ নয়: প্রতিসম পার্থক্য এবং পার্থক্য এক নয়।
সাইমন নিক্কারসন

তাহলে test1অন্তর্ভুক্ত 6, উত্তর 4,5,6 হবে? যেমন আপনি কি প্রতিসম পার্থক্য চান en.wikedia.org/wiki/Symmetric_differences
কলিন ডি

1
যদি টেস্ট 1-এ 6 থাকে তবে আমি উত্তরটি এখনও 4, 5 হতে চাই
ডেভিড টুনেল

উত্তর:


197

এটা চেষ্টা কর

test2.removeAll(test1);

সেট # removeAll

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


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

129
কিভাবে জাভা পিত্ত এই ডাটা স্ট্রাকচার একটি কল করার থাকতে পারে Setযখন এটি সংজ্ঞায়িত না union, intersectionবা difference!!!
জেমস নিউম্যান

10
এই সমাধানটি পুরোপুরি সঠিক নয়। কারণ টেস্ট 1 এবং টেস্ট 2 এর ক্রমটি একটি পার্থক্য করে।
বোজন পেটকভিক

1
test1.removeAll(test2);একই ফলাফল কি ফিরে আসবে test2.removeAll(test1);?
datv

3
@ datv ফলাফলটি ভিন্ন হবে। test1.removeAll(test2)একটি খালি সেট। test2.removeAll(test1)হয় {4, 5}
নিঃশব্দ 14

122

আপনি যদি পেয়ারা (প্রাক্তন গুগল সংগ্রহ) লাইব্রেরি ব্যবহার করেন তবে এর সমাধান রয়েছে:

SetView<Number> difference = com.google.common.collect.Sets.difference(test2, test1);

ফিরে আসাটি SetViewহ'ল Setএটি একটি লাইভ উপস্থাপনা যা আপনি হয় অপরিবর্তনীয় করতে পারেন বা অন্য কোনও সেটে অনুলিপি করতে পারেন। test1এবং test2অক্ষত আছে।


6
নোট করুন যে পরীক্ষার ক্রম 2 এবং টেস্ট 1 বিষয়গুলি। সেখানে প্রতিসম ডিজিফারেন্স () রয়েছে যেখানে অর্ডারটি কোনও ব্যাপার নয়।
datv

1
symmetricDifference()চৌরাস্তা বাদে সবই নিয়ে আসবে, মূল প্রশ্নটি এটাই বলেছিল।
অ্যালেনাজ

16

হ্যাঁ:

test2.removeAll(test1)

যদিও এটি রূপান্তরিত হবে test2, সুতরাং আপনার যদি এটি সংরক্ষণের প্রয়োজন হয় তবে একটি অনুলিপি তৈরি করুন।

এছাড়াও, আপনি সম্ভবত <Integer>পরিবর্তে বোঝানো হয়েছে <int>


7

জাভা 8

আমরা মুছে ফেলতে ব্যবহার করতে পারি যদি কোনও ইউটিলিটি পদ্ধতি লিখতে প্রিডিকেট লাগে তবে:

// computes the difference without modifying the sets
public static <T> Set<T> differenceJava8(final Set<T> setOne, final Set<T> setTwo) {
     Set<T> result = new HashSet<T>(setOne);
     result.removeIf(setTwo::contains);
     return result;
}

এবং যদি আমরা এখনও কিছু পূর্ববর্তী সংস্করণে আছি তবে আমরা মুছে ফেলা সমস্ত ব্যবহার করতে পারি:

public static <T> Set<T> difference(final Set<T> setOne, final Set<T> setTwo) {
     Set<T> result = new HashSet<T>(setOne);
     result.removeAll(setTwo);
     return result;
}

3

আপনি যদি জাভা 8 ব্যবহার করে থাকেন তবে আপনি এরকম কিছু চেষ্টা করতে পারেন:

public Set<Number> difference(final Set<Number> set1, final Set<Number> set2){
    final Set<Number> larger = set1.size() > set2.size() ? set1 : set2;
    final Set<Number> smaller = larger.equals(set1) ? set2 : set1;
    return larger.stream().filter(n -> !smaller.contains(n)).collect(Collectors.toSet());
}

4
@ ডাউনভোটার: সম্ভবত আপনি বুঝতে বুঝতে ব্যর্থ হয়েছেন যে অন্যান্য উত্তরগুলি Setকোনটি বড় তা দেখার জন্য এটি পরীক্ষা করে না ... সুতরাং, আপনি যদি Setবৃহত্তর থেকে ছোট আ কে বিয়োগ করার চেষ্টা করছেন Set, আপনি বিভিন্ন ফলাফল পাবেন receive
জোশ এম

40
আপনি ধরে নিচ্ছেন যে এই ফাংশনের গ্রাহক সর্বদা ছোট সেটটি বিয়োগ করতে চান। সেট পার্থক্যটি অ্যান্টিকমুটিভেটিভ ( en.wikedia.org/wiki/Anticommutativity )। এবি! = বিএ
সাইমন

7
আপনি যে পার্থক্যটির ভিন্নতা প্রয়োগ করেন তা নির্বিশেষে আমি public static <T> Set<T> difference(final Set<T> set1, final Set<T> set2) {স্বাক্ষর হিসাবে ব্যবহার করব , পদ্ধতিটি তখন জেনেরিক ইউটিলিটি ফাংশন হিসাবে ব্যবহারযোগ্য।
কেপ

1
@ কেপ করুন তবে তারপরে Comparator<T>তুলনাটি কাস্টমাইজ করতে সক্ষম হোন কারণ equalsসর্বদা যথেষ্ট নয়।
gervais.b

6
এটি অপ্রত্যাশিত ফলাফলের দিকে নিয়ে যাবে কারণ ব্যবহারকারীকে সচেতন না করে পার্থক্যটির ক্রমের ক্রমটি পরিবর্তন করা যেতে পারে। একটি ছোট সেট থেকে বৃহত্তর সেট বিয়োগের অঙ্কটি গাণিতিকভাবে সুসংজ্ঞায়িত এবং এর জন্য প্রচুর ব্যবহারের কেস রয়েছে।
জোয়েল করনেট

3

আপনি CollectionUtils.disjunctionসমস্ত পার্থক্য পেতে বা CollectionUtils.subtractপ্রথম সংগ্রহের মধ্যে পার্থক্য পেতে ব্যবহার করতে পারেন ।

এটি কীভাবে করা যায় তার একটি উদাহরণ এখানে দেওয়া হয়েছে:

    var collection1 = List.of(1, 2, 3, 4, 5);
    var collection2 = List.of(2, 3, 5, 6);
    System.out.println(StringUtils.join(collection1, " , "));
    System.out.println(StringUtils.join(collection2, " , "));
    System.out.println(StringUtils.join(CollectionUtils.subtract(collection1, collection2), " , "));
    System.out.println(StringUtils.join(CollectionUtils.retainAll(collection1, collection2), " , "));
    System.out.println(StringUtils.join(CollectionUtils.collate(collection1, collection2), " , "));
    System.out.println(StringUtils.join(CollectionUtils.disjunction(collection1, collection2), " , "));
    System.out.println(StringUtils.join(CollectionUtils.intersection(collection1, collection2), " , "));
    System.out.println(StringUtils.join(CollectionUtils.union(collection1, collection2), " , "));

3
কোন প্রকল্প CollectionUtilsথেকে আসে? 1 কে কি ধরে নিতে হবে যে এটি অ্যাপাচি কমন্স সংগ্রহ থেকে এসেছে?
বুহাকে সিন্ধি

0

এখানে একটি উদাহরণ দেওয়ার জন্য (সিস্টেমটি রয়েছে existingState, এবং আমরা অপসারণের জন্য উপাদানগুলি খুঁজে পেতে চাই (যে উপাদানগুলিতে থাকে না newStateতারা উপস্থিত থাকে existingState) এবং যোগ করতে উপাদানগুলি (যে উপাদানগুলিতে রয়েছে newStateতবে উপস্থিত নেই existingState):

public class AddAndRemove {

  static Set<Integer> existingState = Set.of(1,2,3,4,5);
  static Set<Integer> newState = Set.of(0,5,2,11,3,99);

  public static void main(String[] args) {

    Set<Integer> add = new HashSet<>(newState);
    add.removeAll(existingState);

    System.out.println("Elements to add : " + add);

    Set<Integer> remove = new HashSet<>(existingState);
    remove.removeAll(newState);

    System.out.println("Elements to remove : " + remove);

  }
}

ফলাফল হিসাবে এটি আউটপুট হবে:

Elements to add : [0, 99, 11]
Elements to remove : [1, 4]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.