indexOf केस सेंसिटिव?


81

क्या इंडेक्सऑफ (स्ट्रिंग) विधि मामला संवेदनशील है? यदि हां, तो क्या इसका कोई मामला असंवेदनशील संस्करण है?


3
ऐसा नहीं है कि मैं एक बड़ा प्रदर्शन आदमी या कुछ भी हूँ (मैं वास्तव में प्रदर्शन ट्यूनिंग को बुराई का विचार करता हूं), लेकिन .toUpperCase आपके स्ट्रिंग को हर बार जब आप इसे कॉल करता है तो कॉपी करता है यदि आप इसे लूप में करते हैं, तो .toUpperCase को स्थानांतरित करने का प्रयास करें। यदि संभव हो तो लूप का।
बिल के

जवाबों:


75

indexOf()तरीकों सभी केस-संवेदी होते। आप उन्हें (मोटे तौर पर, टूटे-फूटे तरीके से, लेकिन बहुत से मामलों के लिए काम कर सकते हैं) केस-असंवेदनशील अपने तार को ऊपरी / निचले मामले में पहले से परिवर्तित कर सकते हैं:

s1 = s1.toLowerCase(Locale.US);
s2 = s2.toLowerCase(Locale.US);
s1.indexOf(s2);

4
टॉपर कैस का उपयोग करते समय अंतर्राष्ट्रीयकरण के मुद्दों (यानी तुर्की of) से सावधान रहें। एक अधिक उचित समाधान str.toUpperCase (Locale.US) .indexOf (...) का उपयोग करना है;
जेम्स वान हुआस

2
मुझे पूरा यकीन है कि मामला-परिवर्तित करना और फिर यूनिकोड तुलना नियमों के अनुसार तुलना करना पूरी तरह से सही नहीं है। यह कुछ चीजों के लिए काम करता है (अर्थात् केस फोल्डिंग, जिसे आम तौर पर केवल सिंटैक्स पार्सिंग संदर्भों में उपयोग किया जाता है) लेकिन प्राकृतिक भाषा के लिए विशेष मामले हो सकते हैं जहां दो तारों की तुलना बराबर नहीं होनी चाहिए, दोनों अपरकेस या दोनों लोअरकेस के तहत। मैं बल्ले से किसी भी उदाहरण के साथ नहीं आ सकता।
नीलम

7
काम नहीं करेगा। कुछ अजीब, अंतर्राष्ट्रीय वर्णों को कई वर्णों में परिवर्तित किया जाता है, जब उन्हें निम्न / ऊपरी-मामले में परिवर्तित किया जाता है। उदाहरण के लिए:"ß".toUpperCase().equals("SS")
शमौन

ß शायद ही कोई अजीब चरित्र है और यह शायद ही अंतर्राष्ट्रीय है, जिसका उपयोग केवल जर्मनी और ऑस्ट्रिया में किया जा रहा है। लेकिन हाँ, यह उतना ही अच्छा है जितना इसे मिलता है, लेकिन वास्तव में एक मामले में असंवेदनशील तुलना नहीं है, क्योंकि नील्सम ने तीन साल पहले ही बताया था।
जॉय

तुर्की यूनिकोड के लिए काम नहीं करता है, जो किसी के ईमेल से सीधे आता है।
अलेक्जेंडर पोगरेबनेक

43

क्या इंडेक्सऑफ (स्ट्रिंग) विधि मामला संवेदनशील है?

हां, यह संवेदनशील है:

@Test
public void indexOfIsCaseSensitive() {
    assertTrue("Hello World!".indexOf("Hello") != -1);
    assertTrue("Hello World!".indexOf("hello") == -1);
}

यदि हां, तो क्या इसका कोई मामला असंवेदनशील संस्करण है?

नहीं, वहाँ नहीं है। IndexOf पर कॉल करने से पहले आप दोनों स्ट्रिंग्स को लोअर केस में बदल सकते हैं:

@Test
public void caseInsensitiveIndexOf() {
    assertTrue("Hello World!".toLowerCase().indexOf("Hello".toLowerCase()) != -1);
    assertTrue("Hello World!".toLowerCase().indexOf("hello".toLowerCase()) != -1);
}

8
ओह प्लीज प्लीज प्लीज लोकेल.यूएस के साथ कल्चर इन्वेरिएंट कन्वर्सेशन का इस्तेमाल करना न भूलें, हमें तुर्की लोकेल के तहत चलने वाले जावा एप्लिकेशन की काफी दिक्कतें थीं।
इडसुन

@idursun - यूएस लोकेल के लिए मजबूर करने से समस्या का समाधान नहीं होता है, क्योंकि यह अभी भी स्ट्रिंग्स के लिए काम नहीं करता है जिसमें वास्तव में ऐसे अक्षर होते हैं जो शुरू करने के लिए समस्याग्रस्त होते हैं (उदाहरण के लिए "ı".toLowerCase(Locale.US).indexOf("I".toLowerCase(Locale.US))0 वापस आ जाना चाहिए क्योंकि पहला स्ट्रिंग एक तुर्की निचला मामला है "I", और इसलिए "I"दूसरे में ऊपरी-मामले के बराबर तुलना करना चाहिए , लेकिन रिटर्न -1 क्योंकि बाद को "i"इसके बजाय बदल दिया जाता है)।
जूल्स

20

अपाचे कॉमन्स लैंग लाइब्रेरी के स्ट्रिंगरटिल्स वर्ग में एक अनदेखी मामला विधि है

indexOfIgnoreCase (CharSequence str, CharSequence searchStr)


यह एक स्वीकृत उत्तर होना चाहिए, क्योंकि वर्तमान में कुछ गैर-एससीआई स्ट्रिंग्स के लिए काम नहीं होता है जिसमें यूनिकोड नियंत्रण वर्ण होते हैं। उदाहरण के लिए, यह तुर्की भाषा में लिखे गए पाठ के लिए काम करता है। दृश्य के पीछे अपाचे क्षेत्रमैच का उपयोग करता है, और वह काम करता है।
अलेक्जेंडर पोगरेबनेक

17

हाँ, indexOfमामला संवेदनशील है।

केस असंवेदनशीलता के लिए सबसे अच्छा तरीका मुझे मिला है:

String original;
int idx = original.toLowerCase().indexOf(someStr.toLowerCase());

जो असंवेदनशील मामला करेगा indexOf()


2
नहीं, ऐसा कभी मत करो। कारण यह है, original.toLowerCase().length()हमेशा बराबर नहीं होता है original.length()। परिणाम idxसही तरीके से वापस मैप करने में सक्षम नहीं है original
चोक यान चेंग

14

यहां मेरा समाधान है जो किसी भी ढेर मेमोरी को आवंटित नहीं करता है, इसलिए यह यहां उल्लिखित अन्य कार्यान्वयनों की तुलना में काफी तेज होना चाहिए।

public static int indexOfIgnoreCase(final String haystack,
                                    final String needle) {
    if (needle.isEmpty() || haystack.isEmpty()) {
        // Fallback to legacy behavior.
        return haystack.indexOf(needle);
    }

    for (int i = 0; i < haystack.length(); ++i) {
        // Early out, if possible.
        if (i + needle.length() > haystack.length()) {
            return -1;
        }

        // Attempt to match substring starting at position i of haystack.
        int j = 0;
        int ii = i;
        while (ii < haystack.length() && j < needle.length()) {
            char c = Character.toLowerCase(haystack.charAt(ii));
            char c2 = Character.toLowerCase(needle.charAt(j));
            if (c != c2) {
                break;
            }
            j++;
            ii++;
        }
        // Walked all the way to the end of the needle, return the start
        // position that this was found.
        if (j == needle.length()) {
            return i;
        }
    }

    return -1;
}

और यहां इकाई परीक्षण हैं जो सही व्यवहार को सत्यापित करते हैं।

@Test
public void testIndexOfIgnoreCase() {
    assertThat(StringUtils.indexOfIgnoreCase("A", "A"), is(0));
    assertThat(StringUtils.indexOfIgnoreCase("a", "A"), is(0));
    assertThat(StringUtils.indexOfIgnoreCase("A", "a"), is(0));
    assertThat(StringUtils.indexOfIgnoreCase("a", "a"), is(0));

    assertThat(StringUtils.indexOfIgnoreCase("a", "ba"), is(-1));
    assertThat(StringUtils.indexOfIgnoreCase("ba", "a"), is(1));

    assertThat(StringUtils.indexOfIgnoreCase("Royal Blue", " Royal Blue"), is(-1));
    assertThat(StringUtils.indexOfIgnoreCase(" Royal Blue", "Royal Blue"), is(1));
    assertThat(StringUtils.indexOfIgnoreCase("Royal Blue", "royal"), is(0));
    assertThat(StringUtils.indexOfIgnoreCase("Royal Blue", "oyal"), is(1));
    assertThat(StringUtils.indexOfIgnoreCase("Royal Blue", "al"), is(3));
    assertThat(StringUtils.indexOfIgnoreCase("", "royal"), is(-1));
    assertThat(StringUtils.indexOfIgnoreCase("Royal Blue", ""), is(0));
    assertThat(StringUtils.indexOfIgnoreCase("Royal Blue", "BLUE"), is(6));
    assertThat(StringUtils.indexOfIgnoreCase("Royal Blue", "BIGLONGSTRING"), is(-1));
    assertThat(StringUtils.indexOfIgnoreCase("Royal Blue", "Royal Blue LONGSTRING"), is(-1));  
}

इस सवाल का जवाब कैसे देता है ??
गुणवत्ता उत्प्रेरक

7
जवाब है "नहीं, इंडेक्सऑफ के असंवेदनशील संस्करण कोई केस नहीं हैं"। हालाँकि, मैंने यहाँ समाधान जोड़ा क्योंकि लोग इस पृष्ठ को खोजने जा रहे हैं जो समाधान खोज रहे हैं। मैंने अपना समाधान परीक्षण मामलों के साथ उपलब्ध कराया ताकि आने वाला अगला व्यक्ति मेरे कोड का उपयोग करके उसी समस्या को हल कर सके। इसीलिए स्टैक ओवरफ्लो उपयोगी है? मुझे उच्च प्रदर्शन कोड लिखने का एक दशक का अनुभव है, इसका आधा हिस्सा Google पर है। मैंने सिर्फ समुदाय की मदद के लिए मुफ्त में एक अच्छी तरह से परीक्षण किया गया समाधान दिया।
Zach Vorhies

3
यह वही है जो मुझे दिलचस्पी थी। मुझे यह अपाचे कॉमन्स संस्करण की तुलना में लगभग 10-15% तेज पाया गया। अगर मैं इसे कई बार बढ़ा सकता हूं तो मैं करूंगा। धन्यवाद!
जेफ विलियम्स

धन्यवाद जेफ, मुझे खुशी है कि इसने आपको बहुत मूल्य दिया। ऐसे अन्य लोग हैं जो यह सलाह दे रहे हैं कि समाधान प्रदान करने वाला यह पद शीर्ष की ओर जाता है। अगर कोई और मेरा कोड पसंद करता है तो मैं विनम्रतापूर्वक पूछता हूं कि आप इस समाधान को बढ़ाएं।
Zach Vorhies

2
यहाँ एक लापता परीक्षण मामला है:assertThat(StringUtils.indexOfIgnoreCase("ı" /* Turkish lower-case I, U+0131 */, "I"), is(0));
जूल्स

10

हां, यह केस-संवेदी है। खोज करने से पहले आप indexOfअपने स्ट्रिंग और स्ट्रिंग पैरामीटर को ऊपरी-मामले में परिवर्तित करके एक केस-असंवेदनशील कर सकते हैं ।

String str = "Hello world";
String search = "hello";
str.toUpperCase().indexOf(search.toUpperCase());

ध्यान दें कि टॉपर कैस कुछ परिस्थितियों में काम नहीं कर सकता है। उदाहरण के लिए यह:

String str = "Feldbergstraße 23, Mainz";
String find = "mainz";
int idxU = str.toUpperCase().indexOf (find.toUpperCase ());
int idxL = str.toLowerCase().indexOf (find.toLowerCase ());

idxU 20 होगा, जो गलत है! idxL 19 होगा, जो सही है। समस्या का कारण क्या है थ्यूपरकैस () "into" चरित्र को TWO वर्णों में परिवर्तित करता है, "SS" और यह अनुक्रमणिका को बंद कर देता है।

नतीजतन, हमेशा toLowerCase () के साथ रहें


1
लोअर केस से चिपके रहने से मदद नहीं मिलती: यदि आप इसमें बदलाव findकरते हैं "STRASSE", तो यह लोअर केस वेरिएंट में बिल्कुल नहीं मिलता है, लेकिन ऊपरी केस वर्जन में इसे सही तरीके से ढूंढता है।
जूल्स

3

एक बार वापस आने के बाद आप सूचकांक मूल्य के साथ क्या कर रहे हैं?

यदि आप इसे अपनी स्ट्रिंग में हेरफेर करने के लिए उपयोग कर रहे हैं, तो क्या आप इसके बजाय एक नियमित अभिव्यक्ति का उपयोग नहीं कर सकते हैं?

import static org.junit.Assert.assertEquals;    
import org.junit.Test;

public class StringIndexOfRegexpTest {

    @Test
    public void testNastyIndexOfBasedReplace() {
        final String source = "Hello World";
        final int index = source.toLowerCase().indexOf("hello".toLowerCase());
        final String target = "Hi".concat(source.substring(index
                + "hello".length(), source.length()));
        assertEquals("Hi World", target);
    }

    @Test
    public void testSimpleRegexpBasedReplace() {
        final String source = "Hello World";
        final String target = source.replaceFirst("(?i)hello", "Hi");
        assertEquals("Hi World", target);
    }
}

यहाँ अपवित्रता की कमी से आश्चर्यचकित। गलत उत्तरों के वर्चस्व वाले पृष्ठ में, यह केवल तीन में से एक है जो वास्तव में सही ढंग से काम करता है।
जूल्स

2

मैंने सिर्फ स्रोत को देखा है। यह चार्ट की तुलना करता है इसलिए यह संवेदनशील है।


2
@Test
public void testIndexofCaseSensitive() {
    TestCase.assertEquals(-1, "abcDef".indexOf("d") );
}

यह भी पूर्ण प्रश्न का उत्तर नहीं देता
है..यह

2
आप सही हैं मैं नहीं था, मैं उम्मीद कर रहा था कि यह मूल प्रश्नकर्ता को उसे / स्वयं परीक्षण चलाने के लिए प्रेरित करेगा, और शायद आदत में पड़ जाए
पॉल मैकेंजी

2
ठीक है, यह ठीक है ... लेकिन मैं तर्क दूंगा कि एक प्रश्न के लिए वोट देना बेहतर होगा जो वास्तव में एक परीक्षण की तुलना में जवाब देता है। StackOverflow एक कोड Q और A रिपॉजिटरी बनने की कोशिश कर रहा है। इस प्रकार पूर्ण उत्तर सर्वोत्तम होगा।
jjnguy

1
@jjnguy: मैं हमेशा इस धारणा के तहत था कि जो लोग परीक्षा देते हैं, वे परीक्षाएं पास करते हैं। @dfa तरह ने एक ऐसा ही काम किया। (लेकिन @ dfa का उत्तर अधिक पूर्ण है)।
टॉम

लेकिन उन्होंने कुछ शब्द (विवरण) भी पोस्ट किए ... जो आमतौर पर सहायक होते हैं।
jjnguy

2

हाँ, मुझे पूरा यकीन है कि यह है। मानक पुस्तकालय का उपयोग करते हुए चारों ओर काम करने का एक तरीका होगा:

int index = str.toUpperCase().indexOf("FOO"); 

2

एक ही समस्या थी। मैंने नियमित अभिव्यक्ति और अपाचे StringUtils.indexOfIgnoreCase-Method की कोशिश की, लेकिन दोनों बहुत धीमे थे ... इसलिए मैंने खुद एक छोटा तरीका लिखा ...:

public static int indexOfIgnoreCase(final String chkstr, final String searchStr, int i) {
    if (chkstr != null && searchStr != null && i > -1) {
          int serchStrLength = searchStr.length();
          char[] searchCharLc = new char[serchStrLength];
          char[] searchCharUc = new char[serchStrLength];
          searchStr.toUpperCase().getChars(0, serchStrLength, searchCharUc, 0);
          searchStr.toLowerCase().getChars(0, serchStrLength, searchCharLc, 0);
          int j = 0;
          for (int checkStrLength = chkstr.length(); i < checkStrLength; i++) {
                char charAt = chkstr.charAt(i);
                if (charAt == searchCharLc[j] || charAt == searchCharUc[j]) {
                     if (++j == serchStrLength) {
                           return i - j + 1;
                     }
                } else { // faster than: else if (j != 0) {
                         i = i - j;
                         j = 0;
                    }
              }
        }
        return -1;
  }

मेरे परीक्षणों के अनुसार इसकी गति बहुत तेज़ है ... (कम से कम अगर आपकी सर्चस्ट्रीमिंग कम बल्कि) है। यदि आपके पास सुधार या बग के लिए कोई सुझाव है तो मुझे बताना अच्छा होगा ... (जब से मैं एक कोड में इस कोड का उपयोग करता हूं;;)


यह वास्तव में बहुत चालाक है, क्योंकि सर्चस्ट्रिंग खोज करने के लिए पाठ की तुलना में काफी कम होगा, और यह केवल खोज के ऊपरी और निचले संस्करण बनाता है। उसके लिये आपका धन्यवाद!
फिफ्फी

यह मेरे परीक्षण में स्ट्रिंगटीलिल्स संस्करण की तुलना में काफी धीमा है। हालांकि, ज़च का जवाब 10-15% तेजी से पसंद है।
जेफ विलियम्स

यह समाधान Zach Vorhies द्वारा दिए गए की तुलना में लगभग 10% तेज है। इस समाधान के लिए धन्यवाद।
गोगोनोमे

यह समाधान ऊपरी मामले में रूपांतरण पर लंबाई बदलने वाले तारों की उपस्थिति में एक सही उत्तर का उत्पादन नहीं करता है (जैसे यदि आप "find" की खोज करते हैं तो यह किसी भी स्ट्रिंग में मिल जाएगा जिसमें एक एकल पूंजी "S" है) या पाठ के लिए वैकल्पिक पूंजीकरण का उपयोग करता है (जैसे indexOfIgnoreCase("İ","i")0 लौटना चाहिए क्योंकि तुर्की पाठ İके iलिए सही पूंजीकरण है , लेकिन इसके बजाय रिटर्न -1 क्योंकि iअधिक सामान्य के लिए पूंजीकृत है I)।
जूल्स

1

पहले सवाल का जवाब कई बार दिया जा चुका है। हाँString.indexOf() विधियां सभी मामले के प्रति संवेदनशील हैं।

यदि आपको एक स्थानीय-संवेदनशील की आवश्यकता है तो आप Collator काindexOf() उपयोग कर सकते हैं । आपके द्वारा निर्धारित शक्ति मान के आधार पर, आप मामले की असंवेदनशील तुलना प्राप्त कर सकते हैं, और उच्चारण अक्षरों को भी गैर-उच्चारण वाले लोगों के समान मान सकते हैं, आदि यहाँ एक उदाहरण है कि यह कैसे करें:

private int indexOf(String original, String search) {
    Collator collator = Collator.getInstance();
    collator.setStrength(Collator.PRIMARY);
    for (int i = 0; i <= original.length() - search.length(); i++) {
        if (collator.equals(search, original.substring(i, i + search.length()))) {
            return i;
        }
    }
    return -1;
}

यहाँ अपवित्रता की कमी से आश्चर्यचकित। गलत उत्तरों के वर्चस्व वाले पृष्ठ में, यह केवल तीन में से एक है जो वास्तव में सही ढंग से काम करता है।
जूल्स

1

बस इसे योग करने के लिए, 3 समाधान:

  • toLowerCase () या toUpperCase का उपयोग करना
  • अपाचे के StringUtils का उपयोग कर
  • रेगेक्स का उपयोग करना

अब, मैं क्या सोच रहा था कि कौन सा सबसे तेज है? मैं औसतन पहले वाला अनुमान लगा रहा हूं।


0

लेकिन एक लिखना मुश्किल नहीं है:

public class CaseInsensitiveIndexOfTest extends TestCase {
    public void testOne() throws Exception {
        assertEquals(2, caseInsensitiveIndexOf("ABC", "xxabcdef"));
    }

    public static int caseInsensitiveIndexOf(String substring, String string) {
        return string.toLowerCase().indexOf(substring.toLowerCase());
    }
}

जैसा कि ऊपर टिप्पणी की गई है, यह सही ढंग से पहचानने में विफल रहता है कि "ı"एक लोअर-केस वैरिएंट है (बस सबसे अधिक लंबू में डिफ़ॉल्ट नहीं है) "I"। या वैकल्पिक रूप से, के लिए कोई स्थान जहां के लिए एक मशीन समूह पर चलने अगर "ı" है डिफ़ॉल्ट, यह सूचना है कि करने के लिए असफल हो जायेगी "i"भी की एक लोअर केस संस्करण है "I"
जूल्स

0

दोनों स्ट्रिंग्स को लोअर-केस में बदलना आमतौर पर कोई बड़ी बात नहीं है, लेकिन कुछ स्ट्रिंग्स लंबे होने पर धीमी होती हैं। और अगर आप एक लूप में ऐसा करते हैं तो यह वास्तव में बुरा होगा। इस कारण से, मैं सुझाऊंगा indexOfIgnoreCase


0
 static string Search(string factMessage, string b)
        {

            int index = factMessage.IndexOf(b, StringComparison.CurrentCultureIgnoreCase);
            string line = null;
            int i = index;
            if (i == -1)
            { return "not matched"; }
            else
            {
                while (factMessage[i] != ' ')
                {
                    line = line + factMessage[i];
                    i++;
                }

                return line;
            }

        }

1
ऐसा लग रहा है कि यह
weston

0

यहां अपाचे के स्ट्रिंगटाइल संस्करण जैसा दिखने वाला एक संस्करण है:

public int indexOfIgnoreCase(String str, String searchStr) {
    return indexOfIgnoreCase(str, searchStr, 0);
}

public int indexOfIgnoreCase(String str, String searchStr, int fromIndex) {
    // /programming/14018478/string-contains-ignore-case/14018511
    if(str == null || searchStr == null) return -1;
    if (searchStr.length() == 0) return fromIndex;  // empty string found; use same behavior as Apache StringUtils
    final int endLimit = str.length() - searchStr.length() + 1;
    for (int i = fromIndex; i < endLimit; i++) {
        if (str.regionMatches(true, i, searchStr, 0, searchStr.length())) return i;
    }
    return -1;
}

0

मैं वन के लिए दावा करना चाहता हूं और केवल समाधान अब तक पोस्ट किया गया है जो वास्तव में काम करता है। :-)

समस्याओं का तीन वर्गों से सामना करना पड़ता है।

  1. निचले और अपरकेस के लिए गैर-संक्रमणीय मिलान नियम। अन्य उत्तरों में तुर्की I समस्या का अक्सर उल्लेख किया गया है। String.regionMatches के लिए एंड्रॉइड स्रोत में टिप्पणियों के अनुसार, केस-असंवेदनशील समानता के लिए तुलना करते हुए जॉर्जियाई तुलना नियमों को निचले-मामले में अतिरिक्त रूपांतरण की आवश्यकता होती है।

  2. ऐसे मामले जहां ऊपरी और निचले मामले में अक्षरों की एक अलग संख्या होती है। बहुत सारे समाधान अब तक इन मामलों में विफल रहे हैं। उदाहरण: जर्मन STRASSE बनाम स्ट्रैस में केस-असंवेदनशील समानता है, लेकिन अलग-अलग लंबाई है।

  3. उच्चारण पात्रों की मजबूती। लोकेल और संदर्भ प्रभाव, उच्चारण मेल खाता है या नहीं। फ्रेंच में, 'é' का अपरकेस फॉर्म 'E' है, हालांकि अपरकेस एक्सेंट का उपयोग करने की दिशा में एक आंदोलन है। कनाडाई फ्रांसीसी में, बिना अपवाद के 'é' का ऊपरी-मामला रूप ',' है। खोज करते समय दोनों देशों के उपयोगकर्ता "ई" से "ई" से मिलान करने की अपेक्षा करेंगे। क्या उच्चारण और अस्वीकार्य चरित्र मैच स्थानीय-विशिष्ट हैं। अब विचार करें: क्या "ई" समान "E" है? हाँ। ऐसा होता है। फ्रांसीसी स्थानों में, वैसे भी।

मैं वर्तमान में उपयोग कर रहा हूं android.icu.text.StringSearch में केस-असंवेदनशील इंडेक्सऑफ संचालन के पिछले कार्यान्वयन को सही ढंग से लागू करने के लिए ।

गैर-एंड्रॉइड उपयोगकर्ता आईसीयू 4 जे पैकेज के माध्यम से समान कार्यक्षमता का उपयोग कर सकते हैं com.ibm.icu.text.StringSearch कक्षा ।

एंड्रॉइड के रूप में सही आईसीयू पैकेज ( android.icu.textया com.ibm.icu.text) में संदर्भ कक्षाओं के लिए सावधान रहें और जेआरई दोनों के पास अन्य नामस्थानों (जैसे Collator) में एक ही नाम के साथ कक्षाएं हैं।

    this.collator = (RuleBasedCollator)Collator.getInstance(locale);
    this.collator.setStrength(Collator.PRIMARY);

    ....

    StringSearch search = new StringSearch(
         pattern,
         new StringCharacterIterator(targetText),
         collator);
    int index = search.first();
    if (index != SearchString.DONE)
    {
        // remember that the match length may NOT equal the pattern length.
        length = search.getMatchLength();
        .... 
    }

परीक्षण मामले (स्थान, पैटर्न, लक्ष्य पाठ, अपेक्षित। परिणाम):

    testMatch(Locale.US,"AbCde","aBcDe",true);
    testMatch(Locale.US,"éèê","EEE",true);

    testMatch(Locale.GERMAN,"STRASSE","Straße",true);
    testMatch(Locale.FRENCH,"éèê","EEE",true);
    testMatch(Locale.FRENCH,"EEE","éèê",true);
    testMatch(Locale.FRENCH,"éèê","ÉÈÊ",true);

    testMatch(new Locale("tr-TR"),"TITLE","tıtle",true);  // Turkish dotless I/i
    testMatch(new Locale("tr-TR"),"TİTLE","title",true);  // Turkish dotted I/i
    testMatch(new Locale("tr-TR"),"TITLE","title",false);  // Dotless-I != dotted i.

PS: जब तक मैं यह निर्धारित कर सकता हूं कि सबसे अच्छा, PRIMARY बाइंडिंग स्ट्रेंथ को सही काम करना चाहिए जब शब्दकोश नियमों के अनुसार स्थानीय-विशिष्ट नियम उच्चारण और गैर-उच्चारण वर्णों के बीच अंतर करते हैं; लेकिन मैं इस आधार का परीक्षण करने के लिए किस लोकेल का उपयोग नहीं करता हूं। दान किए गए परीक्षण मामलों की सराहना की जाएगी।


1
यदि आप अपने कोड को डुअल-लाइसेंस करना चाहते हैं, तो कृपया किसी अन्य प्लेटफ़ॉर्म के माध्यम से ऐसा करें, और वहां एक लिंक शामिल करें। प्रत्येक उत्तर के अंत में संलग्न कानूनी रूप से बड़े पैमाने पर बूँद स्टैक ओवरफ्लो में अव्यवस्था की एक अत्यधिक मात्रा को जोड़ती है।
meagar

फिर शायद आपको कोड अंशों पर लागू CC-BY-SA की समस्या का समाधान करने के लिए एक अधिक कुशल तरीका खोजना चाहिए,
रॉबिन डेविस

यह आपके लिए लाइसेंस के अनुदान को हटाने के लिए भी अनुचित लगता है जो मैंने कोड अंशों को प्रदान किया था, जिनके लिए मैं कॉपीराइट रखता हूं।
रॉबिन डेविस

-2

indexOf केस संवेदी है। ऐसा इसलिए है क्योंकि यह सूची में तत्वों की तुलना करने के लिए समान पद्धति का उपयोग करता है। एक ही चीज़ में सम्‍मिलित और हटाना है।


मूल प्रश्न स्ट्रिंग के इंडेक्सऑफ विधि के बारे में है।
जॉन टॉपले

मुझे नहीं पता था कि वह किस बारे में बात कर रहा है। जब तक अन्य लोगों ने कुछ नहीं कहा, मुझे इसका एहसास नहीं हुआ। सिद्धांत हालांकि अभी भी वही है।
रौबी

2
नहीं, यह नहीं है। स्ट्रिंग के इंडेक्सऑफ विधि के इंटर्नल चार्ट की तुलना वस्तुओं से नहीं करते हैं, इसलिए यह बराबर पद्धति का उपयोग नहीं करता है।
जॉन टॉपले
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.