यदि किसी स्ट्रिंग में किसी स्ट्रिंग में से कोई स्ट्रिंग है, तो टेस्ट करें


153

मैं यह देखने के लिए एक स्ट्रिंग का परीक्षण कैसे कर सकता हूं कि इसमें किसी सरणी से तार हैं?

के बजाय का उपयोग करने का

if (string.contains(item1) || string.contains(item2) || string.contains(item3))

4
क्या आप पूछ रहे हैं कि क्या एक स्ट्रिंग सरणी के किसी भी तार के बराबर है, या सरणी में किसी तार शामिल है ?
18

1
आप जांचना चाहते हैं कि क्या सरणी से कोई स्ट्रिंग आपके इनपुट स्ट्रिंग का एक विकल्प है? या आप यह जांचना चाहते हैं कि क्या आपका इनपुट स्ट्रिंग सरणी के किसी एक स्ट्रिंग के बराबर है ? क्या आप अधिक सटीक हो सकते हैं?
सविनो सुगेरा

1
होता है, ताकि यह एक लाइन ले और यह देखे कि क्या इसमें किसी सूची के शब्द शामिल हैं (तार की एक सरणी के रूप में संग्रहीत)
20

जवाबों:


188

EDIT: यहाँ जावा 8 स्ट्रीमिंग एपीआई का उपयोग कर एक अपडेट दिया गया है। इतना साफ-सुथरा। अभी भी नियमित अभिव्यक्तियों के साथ जोड़ा जा सकता है।

public static boolean stringContainsItemFromList(String inputStr, String[] items) {
    return Arrays.stream(items).parallel().anyMatch(inputStr::contains);
}

इसके अलावा, यदि हम इनपुट प्रकार को एक सरणी के बजाय एक सूची में बदलते हैं, जिसका हम उपयोग कर सकते हैं items.parallelStream().anyMatch(inputStr::contains)

.filter(inputStr::contains).findAny()यदि आप मिलान स्ट्रिंग वापस करना चाहते हैं तो आप इसका उपयोग भी कर सकते हैं ।


मूल थोड़ा दिनांकित उत्तर:

यहाँ एक (बहुत बुनियादी) स्थिर विधि है। ध्यान दें कि यह तुलना के तार पर संवेदनशील है। एक आदिम यह केस संवेदी बनाने के लिए जिस तरह से कॉल करने के लिए किया जाएगा toLowerCase()या toUpperCase()दोनों इनपुट और परीक्षण तारों पर।

यदि आपको इससे अधिक जटिल कुछ भी करने की आवश्यकता है, तो मैं पैटर्न और माचिस की कक्षाओं को देखने और कुछ नियमित अभिव्यक्ति करने का तरीका सीखने की सलाह दूंगा । एक बार जब आप उन्हें समझ जाते हैं, तो आप उन वर्गों या String.matches()सहायक विधि का उपयोग कर सकते हैं ।

public static boolean stringContainsItemFromList(String inputStr, String[] items)
{
    for(int i =0; i < items.length; i++)
    {
        if(inputStr.contains(items[i]))
        {
            return true;
        }
    }
    return false;
}

1
नियमित अभिव्यक्ति के साथ इसका उपयोग कैसे करें @gnomed
प्रणीत

हम पहले कार्यान्वयन मामले को संवेदनशील कैसे बना सकते हैं?
१०:११ बजे thanos.a

कार्यान्वयन पहले से ही संवेदनशील हैं। मेरे पास इस बात के भी निर्देश हैं कि उत्तर के निचले पैराग्राफ में इसे असंवेदनशील कैसे बनाया जाए।
gnomed

52
import org.apache.commons.lang.StringUtils;

स्ट्रिंग बर्तन

उपयोग:

StringUtils.indexOfAny(inputString, new String[]{item1, item2, item3})

यह पाया स्ट्रिंग का सूचकांक या -1 मिल जाएगा अगर कोई नहीं मिला।


7
JFI: मुझे उम्मीद है कि इस कार्यान्वयन को केवल इनपुटस्ट्रीमिंग पर एक बार पुनरावृत्त करना होगा, लेकिन मैंने स्ट्रिंग स्ट्रिंग में कोड को देखा, और दुख की बात है कि यह केवल डिफ़ॉल्ट इंडेक्सऑफ के एन कॉल कर रहा है।
alfonx

शायद commons3 पर कार्यान्वयन बेहतर है!
रेननएलेंड्रॉफ

1
नहींं, अभी भी सिर्फ स्ट्रिंग्स पर it.ates. org में हैं। ....
अल्फोंक्स

यह पाए गए स्ट्रिंग के सूचकांक (सरणी से) को वापस नहीं करता है, केवल उस स्थिति का सूचकांक जो स्ट्रिंग पाया गया था।
प्लूटो


16

सबसे आसान तरीका शायद सरणी को java.util.ArrayList में बदलना होगा। एक बार जब यह एक सरणी सूची में होता है, तो आप आसानी से शामिल विधि का लाभ उठा सकते हैं।

public static boolean bagOfWords(String str)
{
    String[] words = {"word1", "word2", "word3", "word4", "word5"};  
    return (Arrays.asList(words).contains(str));
}

70
यह गलत है। ओपी पूछ रहा है कि क्या सरणी stringमें कोई भी Stringएस है, यदि सरणी में कोई भी एस नहीं Stringहै string
ब्यू ग्रांथम

3
@BeauGrantham मैं भी यही सोच रहा था, लेकिन ओपी .equals()अपने पोस्ट में इस्तेमाल कर रहे हैं, जो बहुत ही भ्रामक है। मुझे लगता है उन्हें अपने प्रश्न को संपादित करने की आवश्यकता है
gnomed

@BeauGrantham मैन मैं शपथ नहीं ले सका मैं समस्या को समझ गया। हो सकता है कि प्रश्न को थोड़ा और स्पष्ट करने की आवश्यकता है?
राय कछौ

1
नहीं, इस तरह का उलटा दिशा काम नहीं करेगा, आपको जांचना चाहिए कि स्ट्रिंग में दिए गए मूल्यों में से एक है या नहीं और यदि मानों में स्ट्रिंग शामिल है तो नहीं।
व्लादिमीर स्टाज़िलोव

2
प्रश्न इसके विपरीत है
स्टीफन ग्रिलॉन

16

यदि आप जावा 8 या इसके बाद के संस्करण का उपयोग करते हैं, तो आप ऐसा करने के लिए स्ट्रीम एपीआई पर भरोसा कर सकते हैं :

public static boolean containsItemFromArray(String inputString, String[] items) {
    // Convert the array of String items as a Stream
    // For each element of the Stream call inputString.contains(element)
    // If you have any match returns true, false otherwise
    return Arrays.stream(items).anyMatch(inputString::contains);
}

यह मानते हुए कि आपके पास Stringपरीक्षण करने के लिए बड़े आकार का एक बड़ा सरणी है आप कॉल करके समानांतर में खोज को लॉन्च कर सकते हैं parallel(), कोड तब होगा:

return Arrays.stream(items).parallel().anyMatch(inputString::contains); 

एक अजीब बात जो मैंने देखी, मेरे पास स्ट्रिंग सूची में दो आइटम हैं, मुझे पता चला, जब मैं 'समानांतर' का उपयोग करता हूं तो यह सही परिणाम नहीं लौटाएगा। (भले ही इसमें मूल्य शामिल हो)।
चार्ल्स सी

@ Charles.C यह अजीब है मैं अपनी तरफ से पुन: पेश नहीं कर सकता।
निकोलस फिल्टोफैट

मुझे पूरा यकीन है कि जब तक इनपुट स्ट्रिंग लंबी (~ 500 वर्ण) नहीं हो जाती तब तक धारा को समानांतर रखना यहाँ सब-अप्रीमल होगा। इसके बजाय यदि सरणी बड़ी थी, तो संभवतः सरणी को विभाजन करना और उनमें से प्रत्येक को समानांतर में चलाना बेहतर होगा।
जीवनरक्षक

2

यहाँ एक समाधान है:

public static boolean containsAny(String str, String[] words)
{
   boolean bResult=false; // will be set, if any of the words are found
   //String[] words = {"word1", "word2", "word3", "word4", "word5"};

   List<String> list = Arrays.asList(words);
   for (String word: list ) {
       boolean bFound = str.contains(word);
       if (bFound) {bResult=bFound; break;}
   }
   return bResult;
}


1

एक और अधिक groovyesque दृष्टिकोण का उपयोग किया जाएगा इंजेक्षन के साथ संयोजन में metaClass :

मैं कहना चाहूंगा:

String myInput="This string is FORBIDDEN"
myInput.containsAny(["FORBIDDEN","NOT_ALLOWED"]) //=>true

और विधि होगी:

myInput.metaClass.containsAny={List<String> notAllowedTerms->
   notAllowedTerms?.inject(false,{found,term->found || delegate.contains(term)})
}

आप की जरूरत है containsAny के लिए भविष्य के किसी भी स्ट्रिंग वैरिएबल तो वस्तु के बजाय वर्ग के लिए विधि जोड़ने के उपस्थित रहने की:

String.metaClass.containsAny={notAllowedTerms->
   notAllowedTerms?.inject(false,{found,term->found || delegate.contains(term)})
}

1

इसे इस्तेमाल करे:

if (Arrays.asList(item1, item2, item3).stream().anyMatch(string::contains))

15
प्रश्न इसके विपरीत है: क्या लक्ष्य स्ट्रिंग में सूची का कोई तार शामिल है।
बेसिल बोर्के

1
प्रश्न इसके विपरीत है
स्टीफन ग्रिलॉन 10

0

और अगर आप केस असंवेदनशील मैच की तलाश कर रहे हैं, तो पैटर्न का उपयोग करें

Pattern pattern = Pattern.compile("\\bitem1 |item2\\b",java.util.regex.Pattern.CASE_INSENSITIVE);

    Matcher matcher = pattern.matcher(input);
    if(matcher.find() ){ 

}

0

आप के लिए seraching रहे हैं, तो पूरे शब्द आप इस कि काम करता है क्या कर सकते हैं मामले असंवेदनशील

private boolean containsKeyword(String line, String[] keywords)
{
    String[] inputWords = line.split(" ");

    for (String inputWord : inputWords)
    {
        for (String keyword : keywords)
        {
            if (inputWord.equalsIgnoreCase(keyword))
            {
                return true;
            }
        }
    }

    return false;
}

0

हम भी ऐसा कर सकते हैं:

if (string.matches("^.*?((?i)item1|item2|item3).*$"))
(?i): used for case insensitive
.*? & .*$: used for checking whether it is present anywhere in between the string.

-3

नीचे आपको यह मानकर काम करना चाहिए कि स्ट्रिंग्स वह सरणी है जिसे आप भीतर खोज रहे हैं:

Arrays.binarySearch(Strings,"mykeytosearch",mysearchComparator);

जहां mykeytosearch वह स्ट्रिंग है जिसे आप सरणी के भीतर अस्तित्व के लिए परीक्षण करना चाहते हैं। mysearchComparator - एक तुलनित्र है जिसका उपयोग तार की तुलना करने के लिए किया जाएगा।

अधिक जानकारी के लिए Arrays.binarySearch का संदर्भ लें ।


2
यह ध्यान दिया जाना चाहिए कि द्विआधारी खोज केवल उस सरणी पर काम करता है जिसे क्रमबद्ध किया जाता है, या तो स्वाभाविक रूप से या दिए गए तुलनित्र द्वारा (यदि ऐसा दिया जाता है)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.