সম্ভাব্য নাল মানগুলির সাথে জাভাতে দুটি বস্তুর তুলনা করুন


189

আমি জাভাতে সাম্যের জন্য দুটি স্ট্রিং তুলনা করতে চাই, যখন উভয় বা উভয়ই হতে পারে null, তাই আমি কেবল কল করতে পারি না .equals()। সবচেয়ে ভালো উপায় কি?

boolean compare(String str1, String str2) {
    ...
}

সম্পাদনা:

return ((str1 == str2) || (str1 != null && str1.equals(str2)));

উত্তর:


173

এটি জাভা অভ্যন্তরীণ কোড ব্যবহার করে (অন্যান্য compareপদ্ধতিতে):

public static boolean compare(String str1, String str2) {
    return (str1 == null ? str2 == null : str1.equals(str2));
}

3
স্ট্রিংয়ের ধরণগুলিকে কেবল অবজেক্টে পরিবর্তন করবেন না কেন - এটি আরও জেনেরিক করে তুলছে? এবং তারপর এটি যদি আপনি জাভা 7. সরাতে কি আপনি পাবেন হিসাবে একই
টম

3
কোন জাভা ক্লাসে আপনি সরবরাহ করেছেন এমন পদ্ধতি রয়েছে?
ভোলাডাইমির লেভিস্টস্কি

30
হে! সত্য / মিথ্যা প্রত্যাবর্তনের তুলনা পদ্ধতি আপনার থাকা উচিত নয়। সমান তুলনা হিসাবে একই নয়। তুলনা বাছাইয়ের জন্য দরকারী হতে হবে। আপনার ফিরে আসা উচিত <0, ==0বা >0অন্যটি তুলনায় কোনটি নিম্ন /
গ্রেটার

10
আমি Objects.equals(Object, Object)মার্ক রোটভেল তার উত্তরে নির্দেশ করেছেন বলে ব্যবহার করার পরামর্শ দিচ্ছি (দয়া করে এটি উন্নত করুন)
নিউরন

1
@ এরিক যে এটি সত্যিই ভাল উত্তর কম দেয় না। আমি নিশ্চিত যে আপনি সবচেয়ে ভাল উত্তর দিতে পারবেন না সর্বদা একমাত্র
কোডযুক্ত

315

জাভা 7 যেহেতু আপনি স্থিতিশীল পদ্ধতিটি java.util.Objects.equals(Object, Object)দুটি বস্তুর সমতুল্য চেকগুলি সম্পাদন করতে সেগুলি সম্পর্কে যত্ন না নিয়েই ব্যবহার করতে পারেন null

উভয় বস্তু যদি nullতা হয় তবে তা ফিরে আসবে true, যদি এক হয় nullএবং অন্যটি না হয় তবে তা ফিরে আসবে false। অন্যথায় এটি equalsপ্রথম বস্তুকে কল করার ফলাফলকে দ্বিতীয় হিসাবে আর্গুমেন্ট হিসাবে ফিরিয়ে দেবে ।


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

10
@averasko আপনি যখন ব্যবহার করবেন তখন Object.equals(Object)কোনও কম্পাইল টাইম চেক নেই। Objects.equals(Object, Object)খুব স্বাভাবিক হিসাবে একই কাজ করে equals, এবং পুনরায় অনুমান / আইডিই দ্বারা চেক, যারা নিয়ম যে জন্য সমর্থিত হবে হিউরিস্টিক হয় Objects.equals(Object, Object)(যেমন IntelliJ আইডিয়া 2016,2 উভয় স্বাভাবিক সমান এবং বস্তু থেকে এক জন্য একই চেক আছে)।
মার্ক রোটভিল

2
আমি এই পদ্ধতির পছন্দ। এই দিনগুলির জন্য কিছু অ্যাপাচি কমন্স লাইব্রেরি অন্তর্ভুক্ত করার দরকার নেই।
টর্স্টেন ওজাপার্ভ

1
@ সিমোনবার্স এটি নাল বস্তুর উপর কোনও ক্রিয়াকলাপ চালাচ্ছে না, এটি একটি স্থিতিশীল পদ্ধতি যা আপনি দুটি আর্গুমেন্ট পাস করেন, যা শূন্য হতে পারে, বা কোনও অবজেক্টের রেফারেন্স হতে পারে।
মার্ক রোটভেল

8
imho এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। আমি লিখি প্রতি একক অ্যাপ্লিকেশনটিতে
হুইলটি পুনঃস্থাপন

45

এই ক্ষেত্রে অ্যাপাচি কমন্স স্ট্রিংগিলস # সমান ব্যবহার করা আরও ভাল হবে , এটি ইতিমধ্যে নাল স্ট্রিংগুলি পরিচালনা করে। কোড নমুনা:

public boolean compare(String s1, String s2) {
    return StringUtils.equals(s1, s2);
}

যদি আপনি আছে আত গ্রন্থাগার যুক্ত করতে চান তাহলে, শুধু কপি সোর্স কোড এর StringUtils#equalsপদ্ধতি এবং এটি প্রয়োগ যখন আপনি এটি প্রয়োজন।


28

অ্যান্ড্রয়েডে যারা আছেন, যারা এপিআই 19 এর অবজেক্টস.সেস্কালগুলি (টিআর 1, আরআর 2) ব্যবহার করতে পারবেন না তাদের জন্য এটি রয়েছে:

android.text.TextUtils.equals(str1, str2);

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

সোর্স কোড:

/**
 * Returns true if a and b are equal, including if they are both null.
 * <p><i>Note: In platform versions 1.1 and earlier, this method only worked  well if
 * both the arguments were instances of String.</i></p>
 * @param a first CharSequence to check
 * @param b second CharSequence to check
 * @return true if a and b are equal
 */
public static boolean equals(CharSequence a, CharSequence b) {
    if (a == b) return true;
    int length;
    if (a != null && b != null && (length = a.length()) == b.length()) {
        if (a instanceof String && b instanceof String) {
            return a.equals(b);
        } else {
            for (int i = 0; i < length; i++) {
                if (a.charAt(i) != b.charAt(i)) return false;
            }
            return true;
        }
    }
    return false;
}

7

সংস্করণ 3.5 অ্যাপাচি কমন্স স্ট্রিং ইউটিলে নিম্নলিখিত পদ্ধতি রয়েছে:

static int  compare(String str1, String str2)
static int  compare(String str1, String str2, boolean nullIsLess)
static int  compareIgnoreCase(String str1, String str2)
static int  compareIgnoreCase(String str1, String str2, boolean nullIsLess)

এগুলি নাল নিরাপদ স্ট্রিং তুলনা সরবরাহ করে।


6

জাভা 8 ব্যবহার করে :

private static Comparator<String> nullSafeStringComparator = Comparator
        .nullsFirst(String::compareToIgnoreCase); 

private static Comparator<Metadata> metadataComparator = Comparator
        .comparing(Metadata::getName, nullSafeStringComparator)
        .thenComparing(Metadata::getValue, nullSafeStringComparator);

public int compareTo(Metadata that) {
    return metadataComparator.compare(this, that);
}

4

অ্যাপাচি কমন্স স্ট্রিংইটিস ক্লাসের সমান (-, -) এবং সমতুল্য আইগনোর কেস (-, -) পদ্ধতি ব্যবহার করে দুটি স্ট্রিংয়ের তুলনা করুন।

স্ট্রিংইটিলস.ইকুয়ালস (-, -) :

StringUtils.equals(null, null)   = true
StringUtils.equals(null, "abc")  = false
StringUtils.equals("abc", null)  = false
StringUtils.equals("abc", "abc") = true
StringUtils.equals("abc", "ABC") = false

স্ট্রিংইটিলস.ইক্যুয়ালস আইগনোর কেস (-, -) :

StringUtils.equalsIgnoreCase(null, null)   = true
StringUtils.equalsIgnoreCase(null, "abc")  = false
StringUtils.equalsIgnoreCase("xyz", null)  = false
StringUtils.equalsIgnoreCase("xyz", "xyz") = true
StringUtils.equalsIgnoreCase("xyz", "XYZ") = true


2
boolean compare(String str1, String str2) {
    if(str1==null || str2==null) {
        //return false; if you assume null not equal to null
        return str1==str2;
    }
    return str1.equals(str2);
}

এটা কি আপনি চেয়েছিলেন?


5
falseউভয় স্ট্রিংগুলিই nullপছন্দসই ফলাফল নাও হলে এই কেসটি ফিরে আসে returns
JScoobyCed

1
boolean compare(String str1, String str2) {
    if (str1 == null || str2 == null)
        return str1 == str2;

    return str1.equals(str2);
}


0

ঠিক আছে, সুতরাং "সর্বোত্তম সম্ভাব্য সমাধান" এর অর্থ কী?

যদি আপনি সর্বাধিক পঠনযোগ্য বোঝাতে চান, তবে অভিজ্ঞ সমস্ত জাভা প্রোগ্রামারের জন্য সমস্ত সম্ভাব্য সমাধানগুলি বেশ সমান। তবে আইএমও সবচেয়ে পঠনযোগ্য এটি

 public boolean compareStringsOrNulls(String str1, String str2) {
     // Implement it how you like
 }

অন্য কথায়, বাস্তবায়নটি একটি সাধারণ পদ্ধতির ভিতরে লুকিয়ে রাখুন যা (আদর্শভাবে) অন্তর্ভুক্ত হতে পারে।

(আপনি যদি কোনও তৃতীয় পক্ষের ইউটিলিটি লাইব্রেরিতে "আউটসোর্স" করতে পারেন ... আপনি যদি ইতিমধ্যে এটি আপনার কোডবেসে ব্যবহার করেন তবে)


আপনি যদি সর্বাধিক পারফরম্যান্ট বলতে চান তবে:

  1. সর্বাধিক পারফরম্যান্স সমাধান প্ল্যাটফর্ম এবং প্রসঙ্গে নির্ভর করে,
  2. "প্রসঙ্গ" বিষয়গুলির মধ্যে একটি হল nullযুক্তিগুলির উপস্থিতির আপেক্ষিক (গতিশীল) ফ্রিকোয়েন্সি ,
  3. এটি সম্ভবত কোন সংস্করণটি দ্রুত তা বিবেচনাধীন নয় ... কারণ সামগ্রিক প্রয়োগের পারফরম্যান্সে পার্থক্য আনতে পার্থক্যটি খুব সামান্য
  4. যদি এটি গুরুত্বপূর্ণ হয় তবে আপনার প্ল্যাটফর্মের মধ্যে কোনটি দ্রুততম তা বের করার একমাত্র উপায় হ'ল উভয় সংস্করণ চেষ্টা করে এবং পার্থক্যটি পরিমাপ করা।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.