এমন কোনও জাভা গ্রন্থাগার রয়েছে যা দুটি অবজেক্টকে "আলাদা" করতে পারে?


90

এমন কোন জাভা ইউটিলিটি লাইব্রেরি আছে যা ইউনিক্স প্রোগ্রামের সাথে একই রকম, তবে অবজেক্টের জন্য? আমি এমন কিছু সন্ধান করছি যা একই ধরণের দুটি বস্তুর তুলনা করতে পারে এবং একটি ডেটা স্ট্রাকচার তৈরি করতে পারে যা তাদের মধ্যে পার্থক্যগুলি উপস্থাপন করে (এবং উদাহরণস্বরূপ ভেরিয়েবলগুলিতে পুনরাবৃত্তভাবে পার্থক্যগুলির তুলনা করতে পারে)। আমি কোনও পাঠ্য বিভাজনের জাভা বাস্তবায়ন খুঁজছি না । এটি করার জন্য প্রতিবিম্বটি কীভাবে ব্যবহার করতে হয় সে সম্পর্কে আমি সহায়তাও খুঁজছি না

আমি যে অ্যাপ্লিকেশনটি বজায় করছি তার মধ্যে এই কার্যকারিতাটির একটি ভঙ্গুর বাস্তবায়ন রয়েছে যার কিছু দুর্বল নকশা পছন্দ ছিল এবং এটি আবার লিখতে হবে, তবে আমরা যদি তাক থেকে কিছু ব্যবহার করতে পারি তবে এটি আরও ভাল হবে।

আমি যে ধরণের জিনিসটি খুঁজছি তার একটি উদাহরণ এখানে:

SomeClass a = new SomeClass();
SomeClass b = new SomeClass();

a.setProp1("A");
a.setProp2("X");

b.setProp1("B");
b.setProp2("X");

DiffDataStructure diff = OffTheShelfUtility.diff(a, b);  // magical recursive comparison happens here

তুলনার পরে, ইউটিলিটি আমাকে বলবে যে "প্রোপ 1" দুটি বস্তুর মধ্যে পৃথক এবং "প্রোপ 2" একই is আমি মনে করি ডিফডাটা স্ট্রাকচারের গাছ হওয়া খুব স্বাভাবিক, তবে কোডটি নির্ভরযোগ্য হলে আমি পিক হতে যাচ্ছি না।


9
এটি দেখুন, কোড. google.com/p/jettison
ডেনোকল


14
এটি "জটিল বস্তুর গ্রাফের সমতার জন্য কীভাবে পরীক্ষা করব?" এর সদৃশ নয়? আমি একটি লাইব্রেরি খুঁজছি, এটি কীভাবে করা যায় সে সম্পর্কে পরামর্শ নয়। তদুপরি, আমি ব-দ্বীপে আগ্রহী, না তারা সমান বা না হয়।
কায়প্রো II

4
github.com/jdereg/java-util যা GraphComparator ইউটিলিটি হয়েছে। এই শ্রেণিটি অবজেক্ট গ্রাফের মধ্যে ব-দ্বীপের একটি তালিকা তৈরি করবে। এছাড়াও, এটি কোনও গ্রাফের সাথে একটি ব-দ্বীপকে মার্জ (প্রয়োগ) করতে পারে। কার্যকরভাবে এটি তালিকা <ডেল্টা> = গ্রাফকম্পারেটর (রুটএ, রুটবি)। পাশাপাশি গ্রাফকম্পারটর.অ্যাপ্লিডেল্টা (রুটবি, তালিকা <ডেল্টা>)।
জন DeRegnaucourt

আমি জানি আপনি প্রতিবিম্বটি ব্যবহার করতে চান না, তবে এটি অবশ্যই এরকম কিছু বাস্তবায়নের সহজতম / সহজ উপায়
রোবহরব

উত্তর:


44

কিছুটা দেরি হতে পারে তবে আমি আপনার মতো একই পরিস্থিতিতে ছিলাম এবং আপনার ব্যবহারের ক্ষেত্রে আমার নিজের লাইব্রেরিটি তৈরি করে শেষ করেছি। যেহেতু আমি নিজেই একটি সমাধান নিয়ে আসতে বাধ্য হয়েছিলাম, তাই আমি অন্যদের কঠোর পরিশ্রম থেকে বাঁচাতে গিথুবকে ছেড়ে দেওয়ার সিদ্ধান্ত নিয়েছি। আপনি এটি এখানে পাবেন: https://github.com/SQiShER/java-object-diff

--- সম্পাদনা ---

ওপিএস কোডের উপর ভিত্তি করে এখানে সামান্য ব্যবহারের উদাহরণ দেওয়া হয়েছে:

SomeClass a = new SomeClass();
SomeClass b = new SomeClass();

a.setProp1("A");
a.setProp2("X");

b.setProp1("B");
b.setProp2("X");

DiffNode diff = ObjectDifferBuilder.buildDefault().compare(a, b);

assert diff.hasChanges();
assert diff.childCount() == 1;
assert diff.getChild('prop1').getState() == DiffNode.State.CHANGED;

4
আমি কি আপনাকে এই পোস্টে জাভা-অবজেক্ট-ডিফের ব্যবহারের কেস দেখাচ্ছে? stackoverflow.com/questions/12104969/… এই সহায়ক লাইব্রেরির জন্য অনেক ধন্যবাদ!
ম্যাথিয়াস ওটকে

আমি আপনার পোস্টটিতে একটি উত্তর দেখেছি যা একটি মন্তব্য হিসাবে পোস্ট করতে খুব দীর্ঘ হতে প্রমাণিত হয়েছে, তাই এখানে এটি "সংক্ষিপ্ত" এখানে আছে: gist.github.com/3555555
SQiShER

4
ঝরঝরে। আমি আমার নিজের প্রয়োগটিও লিখে শেষ করেছি। আমি নিশ্চিত না যে আমি আপনার বাস্তবায়নটি সত্যিই খতিয়ে দেখার সুযোগ পাব, তবে আপনি কীভাবে তালিকাগুলি পরিচালনা করবেন তা সম্পর্কে আমি আগ্রহী। আমি মানচিত্রের পার্থক্য হিসাবে সমস্ত সংগ্রহের পার্থক্য হ্যান্ডলিং শেষ করেছি (কী তালিকাতে সেট, সেট বা মানচিত্রের উপর নির্ভর করে কীগুলি বিভিন্ন উপায়ে সংজ্ঞায়িত করে; তারপরে কীসেটে সেট অপারেশন ব্যবহার করে)। তবে সেই পদ্ধতিটি তালিকা-সূচক পরিবর্তনের ক্ষেত্রে অতি সংবেদনশীল। আমি এই সমস্যাটি সমাধান করিনি কারণ আমার অ্যাপ্লিকেশনটির জন্য আমার দরকার পড়েনি, তবে আপনি কীভাবে এটি পরিচালনা করেছেন তা সম্পর্কে আমি আগ্রহী (আরও একটি পাঠ্য-মত, আমি ধরে নিই)।
কায়প্রো II

4
আপনি একটি ভাল বিষয় আনতে হবে। সংগ্রহগুলি মোকাবেলা করতে সত্যই শক্ত। বিশেষত যদি আপনি যেমন আমার মত মার্জ করা সমর্থন করেন। কোনও আইটেম যুক্ত করা হয়েছে, পরিবর্তন হয়েছে বা মুছে ফেলা হয়েছে (হ্যাশকোডের মাধ্যমে, সমান এবং এতে রয়েছে) তা সনাক্ত করতে আমি বস্তুর পরিচয় ব্যবহার করে সমস্যার সমাধান করেছি। সে সম্পর্কে ভাল জিনিসটি হ'ল আমি সমস্ত সংগ্রহকে একইরকম আচরণ করতে পারি। খারাপ জিনিসটি হ'ল, আমি সঠিকভাবে হ্যান্ডেল করতে পারি না (উদাহরণস্বরূপ) অ্যারেলিস্টে একই বস্তু একাধিকবার থাকে। আমি এর জন্য সমর্থন যুক্ত করতে চাই, তবে এটি বেশ জটিল বলে মনে হচ্ছে এবং ভাগ্যক্রমে কেউ এখনও এর জন্য জিজ্ঞাসা করেনি। :-)
এসকিউশিয়ার

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

40

http://javers.org হ'ল লাইব্রেরি যা আপনার যা প্রয়োজন তা সীমাবদ্ধ করে তোলে: তুলনা করার মতো পদ্ধতি রয়েছে (অবজেক্ট বামগ্রাফ, অবজেক্ট রাইটগ্রাফ) ডিফ অবজেক্টটি ফিরিয়ে দেওয়া। ডিফের মধ্যে পরিবর্তনের একটি তালিকা রয়েছে (রেফারেন্সচেঞ্জ, ভ্যালু চেঞ্জ, প্রপার্টি চেঞ্জ) যেমন

given:
DummyUser user =  dummyUser("id").withSex(FEMALE).build();
DummyUser user2 = dummyUser("id").withSex(MALE).build();
Javers javers = JaversTestBuilder.newInstance()

when:
Diff diff = javers.compare(user, user2)

then:
diff.changes.size() == 1
ValueChange change = diff.changes[0]
change.leftValue == FEMALE
change.rightValue == MALE

এটি গ্রাফগুলিতে চক্রগুলি পরিচালনা করতে পারে।

এছাড়াও আপনি যে কোনও গ্রাফ অবজেক্টের স্ন্যাপশট পেতে পারেন। জ্যাভার্সে স্ন্যাপশটের জন্য জেএসওএন সিরিয়ালাইজার এবং ডিসরিযায়ার রয়েছে এবং পরিবর্তিত হয় যাতে আপনি এগুলি সহজেই ডাটাবেসে সংরক্ষণ করতে পারেন। এই লাইব্রেরির সাহায্যে আপনি নিরীক্ষণের জন্য একটি মডিউল সহজেই প্রয়োগ করতে পারেন।


4
এটি কাজ করে না আপনি কীভাবে একটি জাভার্স উদাহরণ তৈরি করবেন?
রায়ান ভেটটিজ

4
জাভেরের কাছে দুর্দান্ত ডকুমেন্টেশন রয়েছে যা সমস্ত কিছু ব্যাখ্যা করে: javers.org
Paweł

4
আমি এটি ব্যবহার করার চেষ্টা করেছি তবে কেবল জাভা> = 7 এর জন্য। বন্ধুরা, এখনও জাভা 6-তে প্রকল্পগুলিতে লোকেরা কাজ করছে !!!
জেসন্তানা

4
আমি যদি যে দুটি বস্তুর সাথে তুলনা করি তার অভ্যন্তরীণভাবে অবজেক্টগুলির একটি তালিকা থাকে এবং আমি কী এই পার্থক্যগুলি দেখতে পাচ্ছি? শ্রেণিবিন্যাসের স্তরটি কীভাবে জাওয়াররা তুলনা করতে পারে?
দীপক

4
হ্যাঁ আপনি অভ্যন্তরীণ বস্তুগুলির মধ্যে পার্থক্য দেখতে পাবেন। এই মুহুর্তে শ্রেণিবদ্ধ স্তরটির জন্য কোনও প্রান্তিকতা নেই। জাভারগুলি যতটা সম্ভব গভীরতরভাবে যাবে, সীমাবদ্ধতা স্ট্যাক আকার।
পাউয়ে সিজিমজিক

16

হ্যাঁ, জাভা-ব্যবহার গ্রন্থাগারের একটি গ্রাফকম্পারেটর শ্রেণি রয়েছে যা দুটি জাভা অবজেক্ট গ্রাফের সাথে তুলনা করবে। এটি ডেল্টাসের তালিকা হিসাবে পার্থক্যটি প্রদান করে। গ্রাফকম্পারেটর আপনাকে পাশাপাশি ডেল্টাগুলিকেও একীভূত করতে (প্রয়োগ করতে) অনুমতি দেয়। এই কোডটির কেবল জেডিকে নির্ভরতা রয়েছে, অন্য কোনও লাইব্রেরি নেই।


13
একটি দুর্দান্ত লাইব্রেরি মনে হচ্ছে, আপনার উল্লেখ করা উচিত যে আপনি একজন অনুদানকারী
ক্রিসটোস

4

আপনি অ্যাপাচি থেকে সমাধানটি একবার দেখে নিতে পারেন। কমন্স-ল্যাংয়ের অংশ থেকেই বেশিরভাগ প্রকল্পের ক্লাসপাঠে এটি ইতিমধ্যে রয়েছে।

নির্দিষ্ট ক্ষেত্রের জন্য চেক পার্থক্য (গুলি):
http://commons.apache.org/proper/commons-lang/javadocs/api-3.9/org/apache/commons/lang3/builder/DiffBuilder.html

: ব্যবহার করে প্রতিফলন পার্থক্য চেক করুন
http://commons.apache.org/proper/commons-lang/javadocs/api-3.9/org/apache/commons/lang3/builder/ReflectionDiffBuilder.html


এটি গ্রহণযোগ্য উত্তর হওয়া উচিত!
জনক বান্দারা

3

সমস্ত জাভার লাইব্রেরির কেবল জাভা 7-তে সমর্থন রয়েছে, আমি একটি পরিস্থিতিতে ছিলাম যেহেতু আমি এটি একটি জাভা 6 প্রকল্পের জন্য ব্যবহার করতে চাই তাই আমি উত্সটি গ্রহণ করেছি এবং জাভা 6 এর জন্য এটি যেভাবে কাজ করে তা পরিবর্তন করব নীচে গিথুব কোডটি রয়েছে ।

https://github.com/sand3sh/javers-forJava6

জার লিঙ্ক: https://github.com/sand3sh/javers-forJava6/blob/master/build/javers-forjava6.jar

আমি কেবল জাভা 7 সমর্থিত '<>' জাভা 6 সমর্থনে অন্তর্নিহিত কাস্ট রূপান্তরগুলি পরিবর্তন করেছি আমি সমস্ত কার্যকারিতা গ্যারান্টি দিচ্ছি না যেহেতু আমি আমার জন্য কয়েকটি অপ্রয়োজনীয় কোড মন্তব্য করেছি এটি সমস্ত কাস্টম অবজেক্টের তুলনায় কাজ করে।



1

আপনি এটি এই কোডটি কোথায় ব্যবহার করেন তার উপর নির্ভর করে এটি কার্যকর হবে, এটি দরকারী বা সমস্যাযুক্ত হতে পারে। এই কোড পরীক্ষিত।

    /**
 * @param firstInstance
 * @param secondInstance
 */
protected static void findMatchingValues(SomeClass firstInstance,
        SomeClass secondInstance) {
    try {
        Class firstClass = firstInstance.getClass();
        Method[] firstClassMethodsArr = firstClass.getMethods();

        Class secondClass = firstInstance.getClass();
        Method[] secondClassMethodsArr = secondClass.getMethods();


        for (int i = 0; i < firstClassMethodsArr.length; i++) {
            Method firstClassMethod = firstClassMethodsArr[i];
            // target getter methods.
            if(firstClassMethod.getName().startsWith("get") 
                    && ((firstClassMethod.getParameterTypes()).length == 0)
                    && (!(firstClassMethod.getName().equals("getClass")))
            ){

                Object firstValue;
                    firstValue = firstClassMethod.invoke(firstInstance, null);

                logger.info(" Value "+firstValue+" Method "+firstClassMethod.getName());

                for (int j = 0; j < secondClassMethodsArr.length; j++) {
                    Method secondClassMethod = secondClassMethodsArr[j];
                    if(secondClassMethod.getName().equals(firstClassMethod.getName())){
                        Object secondValue = secondClassMethod.invoke(secondInstance, null);
                        if(firstValue.equals(secondValue)){
                            logger.info(" Values do match! ");
                        }
                    }
                }
            }
        }
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
}

4
ধন্যবাদ, তবে আমাদের ইতিমধ্যে এমন কোড রয়েছে যা প্রতিচ্ছবিটি ব্যবহার করে অবজেক্টের গ্রাফটিতে পরিবর্তনগুলি তালিকাভুক্ত করে। এই প্রশ্নগুলি এটি কীভাবে করবেন তা নয়, এটি চাকাটি পুনরায় উদ্ভাবন এড়ানোর চেষ্টা করার বিষয়ে।
কায়প্রো II

যদি পুনরায় সংশোধন ইতিমধ্যে ঘটে থাকে তবে চাকাটির পুনরায় উদ্ভাবন করা খারাপ নয়। (আইই: পুনর্নবীকরণ করা চাকাটির জন্য ইতিমধ্যে অর্থ প্রদান করা হয়েছিল))
থমাস এডিং

4
আমি আপনার সাথে একমত, কিন্তু এই ক্ষেত্রে পুনর্নবীকরণ কোডটি একটি অকল্পনীয় জগাখিচুড়ি।
কায়প্রো II

4
আমি Fieldsপদ্ধতি না পরীক্ষা করা হবে । পদ্ধতিগুলি যেমন কিছু হতে পারে getRandomNumber()
বোহেমিয়ান

-3

দুটি বস্তু পৃথক কিনা তাড়াতাড়ি আপনাকে জানাতে একটি সহজ পদ্ধতির হ'ল অ্যাপাচি কমন্স লাইব্রেরিটি ব্যবহার করা

    BeanComparator lastNameComparator = new BeanComparator("lname");
    logger.info(" Match "+bc.compare(firstInstance, secondInstance));

এটি আমার পক্ষে কাজ করে না কারণ আমার কোথাও পরিবর্তন হয়েছিল তা নয়, আমার কী পরিবর্তন হয়েছে তাও জানতে হবে।
কায়প্রো II
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.