4 জুন সেট তুলনা করুন


102

আপনি কীভাবে সংক্ষিপ্তভাবে Collectionউপাদানগুলির Setসাম্যতাটিকে দৃsert়তার সাথে দৃ ?়তার সাথে যুক্ত করবেন?



আপনি কি জোড় করে চেষ্টা করছেন যে দুটি সেট একে অপরের সমান (একই উপাদান রয়েছে), বা একই সেটের দুটি উপাদান সমান?
বিলটি

আমার দেখতে হবে যে দুটি সেটের উপাদানগুলি সমান
ইকবাল

উত্তর:


103

আপনি দৃsert়ভাবে বলতে পারেন যে দুটি Setগুলি একে অপরের সমান, যা Set equals()পদ্ধতিটি নির্দেশ করে

public class SimpleTest {

    private Set<String> setA;
    private Set<String> setB;

    @Before
    public void setUp() {
        setA = new HashSet<String>();
        setA.add("Testing...");
        setB = new HashSet<String>();
        setB.add("Testing...");
    }

    @Test
    public void testEqualSets() {
        assertEquals( setA, setB );
    }
}

এই @Testযদি দুটি পাস হবে Setগুলি একই আকারের হয় এবং একই উপাদান ধারণ করে।


7
এটি প্রতিবেদনে খুব ভাল ফলাফল প্রদর্শন করে না। যদি আপনার টুস্ট্রিংগুলি স্পষ্টভাবে সংজ্ঞায়িত করা হয় তবে এটি আরও ভাল, তবে এখনও ভাল নয় (পাঠ্যের কোনও পৃষ্ঠায় একটি ছোট পার্থক্য শেষ হতে পারে)
বিল কে

উহম, আমি কীভাবে আসব: java.lang.AserserError: প্রত্যাশিত: java.util.Hashtable <{CompanyName = 8PKQ9va3nW8pRWb4SjPF2DvdQDBMLZ, Ric = sZwmXAdYKv, ক্যাটাগরি = আভিআরসিএফ.এইচ.আর .20 ame৮}৪৪. but২82ame22২৪.82২H4922২৪.২{}ame22২৪.82{Hame22২৪.ame২Hameame২82.২{২ameame228282২82ame22২৪ پر। = 8PKQ9va3nW8pRWb4SjPF2DvdQDBMLZ, রিক = sZwmXAdYKv, বিভাগ = আভিরফিড, কোটআইডি = 4342740204922826921}>
জিওভান্নি বোটা

3
@ জিওডুয়েড আপনি কি আপনার ক্লাসে ক্লাসে প্রয়োগ করেছেন equalsএবং hashCodeপ্রয়োগ করেছেন যা আপনি আপনার হ্যাশটেবলে সংরক্ষণ করছেন?
বিলটি

যেমন আপনি দেখতে পাচ্ছেন এটি কেবল স্ট্রিং এবং দীর্ঘ long আমি মনে করি যে স্ট্রিংগুলিকে সিরিয়ালাইজড করা এবং ডি-সিরিয়ালাইজড করা হয়েছে যা পরীক্ষা ব্যর্থ করে তোলে তবুও আমি সমস্যাটি খুঁজে পাচ্ছি বলে মনে হচ্ছে না এমন কিছু করার দরকার আছে।
জিওভানি বোট্টা

আমি দুটি হ্যাশসেট <লং> এর সাথে তুলনা করেও আমার পক্ষে কাজ করে নি। @ ম্যাটফ্রিডম্যান উত্তরটি আসলে আমার ব্যবহারের ক্ষেত্রে কাজ করে।
bluecollarcoder

46

অ্যাপাচি আবারও উদ্ধার শুরু করে।

assertTrue(CollectionUtils.isEqualCollection(coll1, coll2));

একটি যাদুমন্ত্র মত কাজ করে. আমি জানি না তবে আমি খুঁজে পেয়েছি যে সংগ্রহের সাথে নিম্নলিখিতগুলি assertEquals(coll1, coll2)সবসময় কাজ করে না। যে ক্ষেত্রে এটি আমার পক্ষে ব্যর্থ হয়েছিল সে ক্ষেত্রে আমার কাছে দুটি সেট সংগ্রহ ছিল সেটস দ্বারা সমর্থিত। হ্যামক্রস্ট বা জুনিট কেউই বলবে না যে সংগ্রহগুলি সমান ছিল যদিও আমি নিশ্চিত যে তারা ছিল। কালেকশন ইউটিস ব্যবহার করে এটি পুরোপুরি কার্যকর হয়।


20
এটি আসলে তুচ্ছ, জটিল অংশটি কলারের কাছে স্পষ্টভাবে ইঙ্গিত দেওয়া
বিল কে

1
স্বীকৃত উত্তরটি মূল প্রশ্নের (ইউনিট পরীক্ষা বিশেষত দুটি বিভাগের জন্য) ভাল উত্তর তবে কালেকশন ইউটিলেস সহ এই উত্তরটি আমি সর্বাধিক সাধারণ ক্ষেত্রে আরও ভাল উত্তর বলে মনে করি। কালেকশন ইউটিস ব্যবহার না করে আমি কোনও সংগ্রহ এবং একটি সেট তুলনা করতে সক্ষম হয়েছি।
জয়

16

সঙ্গে hamcrest :

assertThat(s1, is(s2));

সরল জোর দিয়ে:

assertEquals(s1, s2);

নোট: কংক্রিট সেট শ্রেণীর সমান () পদ্ধতি ব্যবহৃত হয়


1
আমি এই পদ্ধতিটি পছন্দ করি যেহেতু হ্যামরেস্ট 4 ইউনাইট 4 নিয়ে আসে তাই এটি অন্য গ্রন্থাগারের জন্য প্রয়োজন নেই।
জেআরসফটি

2
যখন সেটগুলিতে বিভিন্ন ধরণের থাকে এটি কাজ করতে পারে না।
হ্যান্স-পিটার স্টার

7

আপনি যখন তুলনা করেন একটি বিশেষ আকর্ষণীয় কেস

   java.util.Arrays$ArrayList<[[name,value,type], [name1,value1,type1]]> 

এবং

   java.util.Collections$UnmodifiableCollection<[[name,value,type], [name1,value1,type1]]>

এখনও অবধি, আমি দেখতে পাচ্ছি একমাত্র সমাধান হ'ল উভয়কে সেটগুলিতে পরিবর্তন করা

assertEquals(new HashSet<CustomAttribute>(customAttributes), new HashSet<CustomAttribute>(result.getCustomAttributes()));

বা আমি উপাদান দ্বারা তাদের উপাদান তুলনা করতে পারে।


প্রকৃতপক্ষে, অন্যান্য উত্তরে উপস্থাপিত এর জন্য বেশ কয়েকটি সমাধান রয়েছে। সেটগুলি যাইহোক যাইহোক, এর জন্য কিছুটা দুর্ভাগ্যজনক, কারণ তারা আদেশটিকে উপেক্ষা করে। সম্ভবত অ্যারেলিস্ট?
হ্যান্স-পিটার স্টার

4

অ্যারে ভিত্তিক একটি অতিরিক্ত পদ্ধতি হিসাবে ... আপনি জুনিটেক্সে আনর্ডারড অ্যারে সংস্থানগুলি ব্যবহার করে বিবেচনা করতে পারেন। যদিও অ্যাপাচি কালেকশন ইউটিলেস উদাহরণটি কাজ করবে, সেখানে দৃ solid় দৃser় এক্সটেনশানগুলির একটি প্যাকও রয়েছে:

আমি মনে করি যে

ArrayAssert.assertEquivalenceArrays(new Integer[]{1,2,3}, new Integer[]{1,3,2});

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

অবশ্যই এখানে খারাপ দিকটি হ'ল, জুনিটেক্স হ'ল একটি অতিরিক্ত জার ফাইল বা মাভেন এন্ট্রি ...

 <dependency org="junit-addons" name="junit-addons" rev="1.4"/>

2

এই নিবন্ধটি পরীক্ষা করুন । সেখান থেকে একটি উদাহরণ:

@Test  
public void listEquality() {  
    List<Integer> expected = new ArrayList<Integer>();  
    expected.add(5);  

    List<Integer> actual = new ArrayList<Integer>();  
    actual.add(5);  

    assertEquals(expected, actual);  
}  

সংক্ষিপ্ত তবে দুর্দান্ত লিঙ্কটি, জুনিট 4-
জোহানেস

1
লিঙ্কটি নষ্ট হয়ে গেছে। অনলাইনে সংরক্ষণাগারিত সংস্করণটি খুঁজে পেতে বা এর সামগ্রীর সংক্ষিপ্তসার পেতে পারে এমন কোনও সুযোগ?
pzp

1

হামক্রস্ট ব্যবহার:

assertThat( set1, both(everyItem(isIn(set2))).and(containsInAnyOrder(set1)));

এটিতেও কার্যকর হয় যখন সেটগুলিতে আলাদা আলাদা ডেটাটাইপ থাকে এবং কেবল ব্যর্থ হওয়ার পরিবর্তে পার্থক্যের প্রতিবেদন দেয়।


2
ইসি জন্য আমদানি কি? IntelliJ কোনও হ্যামক্রেট প্যাকেজ দিয়ে আমদানি সমাধান করতে পারে না।
চমত্কার

0

আপনি যদি তালিকা বা সেটটিতে নির্দিষ্ট মানগুলির একটি সেট (ইতিমধ্যে বিদ্যমান সংগ্রহের সাথে তুলনা করার পরিবর্তে) অন্তর্ভুক্ত করে কিনা তা পরীক্ষা করে দেখতে চান তবে প্রায়শই সংগ্রহের টস্ট্রিং পদ্ধতিটি কার্যকর:

String[] actualResult = calltestedmethod();
assertEquals("[foo, bar]", Arrays.asList(actualResult).toString());

List otherResult = callothertestedmethod();
assertEquals("[42, mice]", otherResult.toString());

এটি প্রথমে প্রত্যাশিত সংগ্রহটি নির্মাণ করা এবং এটি প্রকৃত সংগ্রহের সাথে তুলনা করার চেয়ে কিছুটা খাটো এবং লিখতে এবং সঠিক করা সহজ।

(স্বীকারোক্তি হিসাবে, এটি একটি বিশেষভাবে পরিষ্কার পদ্ধতি নয় এবং এটি "foo", "বার" দুটি উপাদান "foo" এবং "বার" থেকে কোনও উপাদানকে আলাদা করতে পারে না But তবে অনুশীলনে আমি মনে করি এটি পরীক্ষা করা সবচেয়ে সহজ এবং দ্রুত অন্যথায় অনেকগুলি বিকাশকারীকে চাপ দেওয়া ছাড়া হবে না))


এটি আপনার ইউনিট পরীক্ষার ফলাফলকে তালিকা থেকে টস্ট্রিং বাস্তবায়নের উপর নির্ভর করে। যদি তারা স্থিতি পরিবর্তন করার সিদ্ধান্ত নেয় তবে ইউনিট পরীক্ষাটি আর কাজ করবে না। আমি এই নিরাপদ বিবেচনা করবে না।
লরেন্স অপের জ্যান্ড্ট

@ লরেনসঅপটজট্যান্ড এবং আপনার অর্থ কি আরাকল কালেকশন.টোলিস্ট () এর ফর্ম্যাটটি পরিবর্তন করছেন? এটি অবশ্যই ঘটবে না। আপনি ঠিক আছেন তবে এটি বিশেষভাবে পরিষ্কার নয়। তবে অনুশীলনে, আমার ধারণা যে এটি সবচেয়ে গুরুত্বপূর্ণ যে টেস্টগুলি লেখা খুব সহজ।
হ্যান্স-পিটার স্টার

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

0

আমি হান্স-পিটার স্টার এর সমাধানটি পছন্দ করি ... তবে আমি মনে করি এটি বেশ সঠিক নয়। দুর্ভাগ্যক্রমে তুলনা করার জন্য containsInAnyOrderএকটি Collectionঅ্যাজেটেস্ক গ্রহণ করে না । সুতরাং এটি একটি Collectionএর হতে হবে Matcher:

assertThat(set1, containsInAnyOrder(set2.stream().map(IsEqual::equalTo).collect(toList())))

আমদানি হ'ল:

import static java.util.stream.Collectors.toList;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.junit.Assert.assertThat;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.