আমি কীভাবে আমার স্ট্রিং তুলনার ক্ষেত্রে সংবেদনশীল হতে পারি?


111

আমি দুটি স্ট্রিংয়ের তুলনা করার জন্য একটি জাভা প্রোগ্রাম তৈরি করেছি:

String s1 = "Hello";
String s2 = "hello";

if (s1.equals(s2)) {
    System.out.println("hai");
} else {
    System.out.println("welcome");
}

এটি "স্বাগতম" প্রদর্শন করে। আমি বুঝতে পারি এটি কেস সংবেদনশীল is তবে আমার সমস্যাটি হ'ল আমি কেস সংবেদনশীলতা ছাড়াই দুটি স্ট্রিং তুলনা করতে চাই। অর্থাৎ আমি আউটপুটটি আশা করি hai


3
যদি আপনি জানেন যে এটি কেস সংবেদনশীল, আপনি তুলনা করার আগে উভয়কে ছোট হাতের বা বড় হাতের মধ্যে রূপান্তর করতে পারেন।
ফাস্টকোডেজাভা

আপনি যদি ব্যবহার করেন তবে s1.equalsIgnoreCase(s2)এটি করা দরকার সর্বত্র এটি করতে ব্যর্থ হতে পারেন । আমি প্রস্তাব দিচ্ছি যে স্ট্রিংটি কোথা থেকে এসেছে - একটি ফাইল বা ডাটাবেস বা ব্যবহারকারীর ইনপুট সম্ভবত - এবং বড় হাতের (বা লোয়ারকেস) রূপান্তর করুন এবং তুলনার জন্য .equals ব্যবহার চালিয়ে যান।
H2ONaCl

2
নিম্ন / বড় আকারে রূপান্তর করবেন না (উপরের মন্তব্যগুলির দ্বারা প্রস্তাবিত), স্বীকৃত equalsIgnoreCaseপদ্ধতির ব্যবহার করুন । তুর্কি আই সমস্যা এবং যুক্তির জন্য অনুরূপ ইউনিকোড সম্পর্কিত বিষয়গুলি পড়ুন।
ওহাদ স্নাইডার

1
@ ওহাদস্কিনিডার equalsIgnoreCaseতবুও তুরস্কের জন্য ভুল মানটি ফিরিয়ে দেয়, কারণ এটি "i" এবং "আমি" তুলনা করে সত্যই ফিরে আসে, যদিও এটি মিথ্যা ফিরতে হবে should সুতরাং আমি সন্দেহ করি যে আপনি যদি লোকেলগুলি অ্যাকাউন্টে নিতে চান তবে Collatorএটি আসলে যাওয়ার উপায়।
ট্রেজকাজ

1
@ ওহাদস্কিনিডার আমি অবাক হই এটি বলেছে যে প্রতি-চরিত্রে এটি করা একই ফলাফল দেয় তবে পুরো স্ট্রিংয়ে toLowerCase/ toUpperCaseচালিয়ে যাওয়া এবং প্রতি-চরিত্রে এটি করা দুটি পৃথক ফলাফলও দেয়।
Trejkaz

উত্তর:


171
  • সেরাটি ব্যবহার করা হবে s1.equalsIgnoreCase(s2): ( জাভাদোক দেখুন )
  • আপনি তাদের উভয়কে আপার / লোয়ার কেসে রূপান্তর করতে পারেন এবং ব্যবহার করতে পারেন s1.equals(s2)

39
কেবল সচেতন থাকুন যে দুটি সমাধান প্রয়োজনীয়ভাবে সমস্ত লোকেলের জন্য অভিন্ন নয়। স্ট্রিং # ইক্যুয়ালআইগনোর কেস লোকেল নির্দিষ্ট কেসিং বিধিগুলি ব্যবহার করছে না, যখন স্ট্রিং # টু লোভারকেস এবং # টুঅপারসকেস করে।
jarnbjo

1
@ জার্নবজো আপনি কি এই উদাহরণটি দিতে পারেন যেখানে এই পার্থক্যের জন্য?
তোয়াই

16
স্থানীয় নির্দিষ্ট ক্ষেত্রে বিধিগুলি তুর্কি এবং জার্মানদের জন্য অন্তত প্রয়োগ করা হয়। তুর্কি আমি এবং বিনা ছাড়াই দুটি আলাদা অক্ষর হিসাবে বিবেচনা করি, নিম্ন / আপার ক্ষেত্রে জোড় তৈরি করে Iİ এবং ıI যখন অন্যান্য ভাষাগুলি iI কে জোড় হিসাবে বিবেচনা করে এবং অক্ষরগুলি the এবং use ব্যবহার করে না İ জার্মান ভাষায়, লোয়ার কেস ß "এসএস" হিসাবে মূলধন করা হয়।
jarnbjo


24

String.equalsIgnoreCase নিষ্পাপ কেস-সংবেদনশীল স্ট্রিং তুলনার জন্য সবচেয়ে ব্যবহারিক পছন্দ।

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

সেই লাইব্রেরিটি আইসিইউ , এবং এখানে কেস-সংবেদনশীল স্ট্রিং তুলনার জন্য কীভাবে কোনও ইউটিলিটি প্রয়োগ করতে পারে:

import com.ibm.icu.text.Normalizer2;

// ...

public static boolean equalsIgnoreCase(CharSequence s, CharSequence t) {
    Normalizer2 normalizer = Normalizer2.getNFKCCasefoldInstance();
    return normalizer.normalize(s).equals(normalizer.normalize(t));
}
    String brook = "flu\u0308ßchen";
    String BROOK = "FLÜSSCHEN";

    assert equalsIgnoreCase(brook, BROOK);

সাদাসিধা তুলনা সঙ্গে String.equalsIgnoreCase, অথবা String.equalsupper- বা lowercased স্ট্রিং এমনকি এই সহজ পরীক্ষা ব্যর্থ হবে।

(যদিও লক্ষ্য করুন যে পূর্বনির্ধারিত কেস ভাঁজ গন্ধটি getNFKCCasefoldInstanceলোকেল-স্বতন্ত্র; তুর্কি লোকালগুলির জন্য জড়িত আরও কিছু কাজ UCharacter.foldCaseপ্রয়োজন হতে পারে))


22

আপনাকে অবজেক্টের compareToIgnoreCaseপদ্ধতিটি ব্যবহার করতে হবে String

int compareValue = str1.compareToIgnoreCase(str2);

if (compareValue == 0)এর অর্থ str1সমান str2


10
import java.lang.String; //contains equalsIgnoreCase()
/*
*
*/
String s1 = "Hello";
String s2 = "hello";

if (s1.equalsIgnoreCase(s2)) {
System.out.println("hai");
} else {
System.out.println("welcome");
}

এখন এটি আউটপুট হবে: hai


5

ডিফল্ট জাভা API এ আপনার রয়েছে:

String.CASE_INSENSITIVE_ORDER

সুতরাং যদি আপনি সাজানো ডেটা স্ট্রাকচার সহ স্ট্রিং ব্যবহার করতে চান তবে আপনাকে তুলনাকারী পুনরায় লেখার দরকার নেই।

String s = "some text here";
s.equalsIgnoreCase("Some text here");

আপনার নিজের কোডে খাঁটি সাম্যতা যাচাইয়ের জন্য আপনি যা চান তা কি।

জাভা স্ট্রিংসের সমতার সাথে সম্পর্কিত যে কোনও বিষয়ে কেবল আরও তথ্যের জন্য। জাভা.ং. স্ট্রিং ক্লাসের হ্যাশকোড () ফাংশন "কেস সেনসিটিভ":

public int hashCode() {
    int h = hash;
    if (h == 0 && value.length > 0) {
        char val[] = value;

        for (int i = 0; i < value.length; i++) {
            h = 31 * h + val[i];
        }
        hash = h;
    }
    return h;
}

সুতরাং আপনি কী হিসাবে স্ট্রিংসের সাথে একটি হ্যাশটেবল / হ্যাশম্যাপ ব্যবহার করতে চান এবং "সামারকি", "কিছু কিছু" এবং "সামকি" এর মতো কীগুলি সমান হিসাবে দেখাতে চাইলে আপনাকে আপনার স্ট্রিংটিকে অন্য শ্রেণিতে আবৃত করতে হবে (আপনি প্রসারিত করতে পারবেন না) স্ট্রিং যেহেতু এটি একটি চূড়ান্ত শ্রেণি)। উদাহরণ স্বরূপ :

private static class HashWrap {
    private final String value;
    private final int hash;

    public String get() {
        return value;
    }

    private HashWrap(String value) {
        this.value = value;
        String lc = value.toLowerCase();
        this.hash = lc.hashCode();
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o instanceof HashWrap) {
            HashWrap that = (HashWrap) o;
            return value.equalsIgnoreCase(that.value);
        } else {
            return false;
        }
    }

    @Override
    public int hashCode() {
        return this.hash;
    }
}

এবং তারপরে এটি ব্যবহার করুন:

HashMap<HashWrap, Object> map = new HashMap<HashWrap, Object>();

2

মনে রাখবেন যে আপনার .equals বা .EqualsIgnoreCase করার আগে আপনি তাদের উপর নাল চেক করতে চাইতে পারেন।

একটি নাল স্ট্রিং অবজেক্ট সমান পদ্ধতিতে কল করতে পারে না।

অর্থাৎ,

public boolean areStringsSame(String str1, String str2)
{
    if (str1 == null && str2 == null)
        return true;
    if (str1 == null || str2 == null)
        return false;

    return str1.equalsIgnoreCase(str2);
}

1
নোট: দ্বিতীয় দুই বিবৃতি ভালো একই ফলাফল উত্পাদন করতে মিলিত করা যেতে পারে: if (str1 == null || str2 == null) return false;
লাকিমি

উপরের মতামত অনুযায়ী ক্লিনার হতে সংশোধিত কোড - দীর্ঘ দিন ছিল :)
VeenarM

1
আপনি if (str1 == str2) return true;উভয় নালকে পূরণ করে এমন প্রথম লাইনটিও পরিবর্তন করতে পারেন এবং দুটি স্ট্রিংয়ের রেফারেন্স একই স্ট্রিং অবজেক্টকে উল্লেখ করে এমন ক্ষেত্রে শর্টকাট করে।
বার্নি




1

নালসাফ হতে, আপনি ব্যবহার করতে পারেন

org.apache.commons.lang.StringUtils.equalsIgnoreCase(String, String)

অথবা

org.apache.commons.lang3.StringUtils.equalsIgnoreCase(CharSequence, CharSequence)

-6
public boolean newEquals(String str1, String str2)
{
    int len = str1.length();
int len1 = str2.length();
if(len==len1)
{
    for(int i=0,j=0;i<str1.length();i++,j++)
    {
        if(str1.charAt(i)!=str2.charAt(j))
        return false;
    }`enter code here`
}
return true;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.