অ্যারেলিস্টের () পদ্ধতিতে কীভাবে বস্তুর মূল্যায়ন করা যায়?


303

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

ArrayList<Thing> basket = new ArrayList<Thing>();  
Thing thing = new Thing(100);  
basket.add(thing);  
Thing another = new Thing(100);  
basket.contains(another); // true or false?

class Thing {  
    public int value;  

    public Thing (int x) {
        value = x;
    }

    equals (Thing x) {
        if (x.value == value) return true;
        return false;
    }
}

এই হল কিভাবে classআছে প্রয়োগ করতে হবে contains()প্রত্যাবর্তন true?

উত্তর:


339

অ্যারেলিস্ট implementsতালিকা ইন্টারফেস।

আপনি তাকান তাহলে জন্য JavadocListcontainsপদ্ধতি আপনি এটা ব্যবহার করে দেখতে হবে equals()পদ্ধতি যদি দুটি বস্তুর একই নির্ণয় করা।


61
আপনি যদি সমান () এর ওভাররাইড করার পরিকল্পনা করেন তবে নিশ্চিত হয়ে নিন যে আপনি হ্যাশকোড () পদ্ধতিটিও ওভাররাইড করেছেন। আপনি যদি না জানতেন, সংগ্রহগুলি ব্যবহার করার সময় জিনিসগুলি প্রত্যাশার মতো কাজ করতে পারে না?
মোহাম্মদ ফরিদ

34
এটি একটি সঠিক উত্তর, তবে নোট করুন যে একটি Objectপরিবর্তে আপনার গ্রহণের জন্য আপনার সমান পদ্ধতিটি পরিবর্তন করতে হবে Thing। আপনি যদি না করেন তবে আপনার সমান পদ্ধতিটি ব্যবহার করা হবে না। :)
mdierker

1
সবেমাত্র নিজের জন্য আবিষ্কার করেছি যে উত্সের উত্স মেনুটির নীচে "জেনারেট হ্যাশকোড () এবং সমান" রয়েছে।
ভোলডিমায়ার কৃপাচ

এটি শিরোনামে প্রশ্নের উত্তর দেয়, তবে বর্ণনায় প্রশ্নটি নয়, যেমন "যদি আমি ঠিক তখন একই নির্মাণকারীর ইনপুট দিয়ে অন্য কোনও বস্তু তৈরি করি, তবে কি () পদ্ধতিটি দুটি বস্তুকে একই হিসাবে মূল্যায়ন করবে?"
রোবগুইনেস

3
Collectionsতাদের জিনিসগুলি একটি অনুকূলিত পদ্ধতিতে করুন, যার অর্থ contains()প্রথমে hashCodeদুটি বস্তুর গুলি পরীক্ষা করে , এবং কেবল তখনই কল করে equals()। যদি hashCodeএসগুলি পৃথক হয় (যা সর্বদা দুটি ভিন্ন উদাহরণের ক্ষেত্রে হয় তবে Thing) equals()পদ্ধতিটি কল করা হবে না। থাম্বের নিয়ম হিসাবে, যখন আপনি ওভাররাইড করবেন equals(), আপনারও ওভাররাইড করতে ভুলবেন না hashCode()
সেবাদাস্তন সাবন্যুক

52

আমি মনে করি সঠিক বাস্তবায়ন হওয়া উচিত

public class Thing
{
    public int value;  

    public Thing (int x)
    {
        this.value = x;
    }

    @Override
    public boolean equals(Object object)
    {
        boolean sameSame = false;

        if (object != null && object instanceof Thing)
        {
            sameSame = this.value == ((Thing) object).value;
        }

        return sameSame;
    }
}

1
ifবিবৃতি অপ্রয়োজনীয়। instanceofযথেষ্ট।
পল

@ পল আপনি যে বক্তব্যটির কথা বলছেন তা কোন অংশে?
ক্রিস্টোফিসিবিবি

4
object != nullকারণ অবস্থা, অপ্রয়োজনীয় object instanceof Thingবস্তু না থাকায় চেক খুব নাল।
আলেকজান্ডার ফারবার

15

অ্যারেলিস্ট সমান তুলনা করতে শ্রেণিতে প্রয়োগ করা সমান পদ্ধতি (আপনার কেস থিং ক্লাস) ব্যবহার করে।


12

সাধারণত পারফরম্যান্স বৃদ্ধির জন্য হলেও, hashCode()আপনি প্রতিবার ওভাররাইড করার সময় সাধারণত ওভাররাইড করা উচিত equals()HashCode()তুলনা করার সময় কোন 'বালতি' আপনার জিনিসটিকে সাজানো হবে তা স্থির করে, সুতরাং যে দুটি দুটি বস্তু equal()সত্যকে মূল্যায়ন করে একই জিনিসটি ফিরে আসবে hashCode value()। আমি ডিফল্ট আচরণের কথা মনে করতে পারি না hashCode()(যদি এটি 0 দেয় তবে আপনার কোডটি ধীরে ধীরে কাজ করা উচিত তবে এটি যদি ঠিকানাটি ফেরত দেয় তবে আপনার কোড ব্যর্থ হবে)। আমার কোডগুলি ব্যর্থ হয়েছে এমন অনেক সময় মনে আছে কারণ আমি hashCode()যদিও ওভাররাইড করতে ভুলে গিয়েছিলাম । :)


7

এটি বস্তুগুলিতে সমান পদ্ধতি ব্যবহার করে। সুতরাং যতক্ষণ না থিং ওভাররাইড করে তুলনা করার জন্য অবজেক্টগুলিতে সঞ্চিত ভেরিয়েবলগুলির সমতুল্য এবং ব্যবহার করে না, এটি contains()পদ্ধতিতে সত্য ফিরে আসবে না ।


6
class Thing {  
    public int value;  

    public Thing (int x) {
        value = x;
    }

    equals (Thing x) {
        if (x.value == value) return true;
        return false;
    }
}

আপনার অবশ্যই লিখতে হবে:

class Thing {  
    public int value;  

    public Thing (int x) {
        value = x;
    }

    public boolean equals (Object o) {
    Thing x = (Thing) o;
        if (x.value == value) return true;
        return false;
    }
}

এখন এটা কাজ করছে ;)


6
আপনার থিং x = (জিনিস) করা উচিত নয়; অন্য
চূড়ান্ত

5

কেবলমাত্র লক্ষ করতে চেয়েছিলেন যে যখন valueকোনও প্রাথমিক প্রকার না হয় তখন নিম্নলিখিত প্রয়োগটি ভুল হয়:

public class Thing
{
    public Object value;  

    public Thing (Object x)
    {
        this.value = x;
    }

    @Override
    public boolean equals(Object object)
    {
        boolean sameSame = false;

        if (object != null && object instanceof Thing)
        {
            sameSame = this.value == ((Thing) object).value;
        }

        return sameSame;
    }
}

সেক্ষেত্রে আমি নিম্নলিখিত প্রস্তাব করছি:

public class Thing {
    public Object value;  

    public Thing (Object x) {
        value = x;
    }

    @Override
    public boolean equals(Object object) {

        if (object != null && object instanceof Thing) {
            Thing thing = (Thing) object;
            if (value == null) {
                return (thing.value == null);
            }
            else {
                return value.equals(thing.value);
            }
        }

        return false;
    }
}

সদৃশ অপসারণ করার সময় এটি কীভাবে বাস্তবায়ন করবেন?
সুজয়

4

অন্যান্য পোস্টার () কীভাবে কাজ করে সে সম্পর্কে প্রশ্নটি সম্বোধন করেছে।

আপনার প্রশ্নের একটি সমান গুরুত্বপূর্ণ দিক হ'ল সঠিকভাবে সমান () এর প্রয়োগ কীভাবে করা যায়। এবং এর উত্তর সত্যিকারের উপর নির্ভর করে যা এই নির্দিষ্ট শ্রেণীর জন্য বস্তুর সমতা গঠন করে। আপনি যে উদাহরণ সরবরাহ করেছেন তাতে যদি আপনার দুটি পৃথক বস্তু থাকে যা উভয়ই x = 5 থাকে তবে সেগুলি কি সমান? এটি আপনি যা করার চেষ্টা করছেন তার উপর নির্ভর করে।

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

আপনি যদি এই জিনিসটি সবে শুরু করছেন তবে জোশুয়া ব্লচের কার্যকর জাভা বইয়ের আমি দৃ strongly়ভাবে প্রস্তাব দিই। এটি একটি দুর্দান্ত পঠিত, এবং এই ধরণের জিনিসটি অন্তর্ভুক্ত করে (আরও ভালভাবে কীভাবে কার্যকর করতে হবে সমান () যখন আপনি পরিচয় ভিত্তিক তুলনা তুলনায় আরও কিছু করার চেষ্টা করছেন)


আমার উদ্দেশ্যটির জন্য আমি চেষ্টা করছিলাম যে সমান মানের একটি বস্তু অ্যারেলিস্টে ছিল কিনা। আমি মনে করি এটি একরকম হ্যাক। বইয়ের সুপারিশের জন্য আপনাকে ধন্যবাদ
মান্টাস বিদুতিস

3

জাভাডক থেকে শর্টকাট :

বুলিয়ান থাকে (অবজেক্ট ও)

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

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