मैं यह देखने के लिए एक स्ट्रिंग का परीक्षण कैसे कर सकता हूं कि इसमें किसी सरणी से तार हैं?
के बजाय का उपयोग करने का
if (string.contains(item1) || string.contains(item2) || string.contains(item3))
मैं यह देखने के लिए एक स्ट्रिंग का परीक्षण कैसे कर सकता हूं कि इसमें किसी सरणी से तार हैं?
के बजाय का उपयोग करने का
if (string.contains(item1) || string.contains(item2) || string.contains(item3))
जवाबों:
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;
}
import org.apache.commons.lang.StringUtils;
उपयोग:
StringUtils.indexOfAny(inputString, new String[]{item1, item2, item3})
यह पाया स्ट्रिंग का सूचकांक या -1 मिल जाएगा अगर कोई नहीं मिला।
आप स्ट्रिंग # माचिस विधि का उपयोग इस तरह कर सकते हैं :
System.out.printf("Matches - [%s]%n", string.matches("^.*?(item1|item2|item3).*$"));
सबसे आसान तरीका शायद सरणी को java.util.ArrayList में बदलना होगा। एक बार जब यह एक सरणी सूची में होता है, तो आप आसानी से शामिल विधि का लाभ उठा सकते हैं।
public static boolean bagOfWords(String str)
{
String[] words = {"word1", "word2", "word3", "word4", "word5"};
return (Arrays.asList(words).contains(str));
}
string
में कोई भी String
एस है, यदि सरणी में कोई भी एस नहीं String
है string
।
.equals()
अपने पोस्ट में इस्तेमाल कर रहे हैं, जो बहुत ही भ्रामक है। मुझे लगता है उन्हें अपने प्रश्न को संपादित करने की आवश्यकता है
यदि आप जावा 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);
यहाँ एक समाधान है:
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;
}
एक और अधिक 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)})
}
इसे इस्तेमाल करे:
if (Arrays.asList(item1, item2, item3).stream().anyMatch(string::contains))
आप के लिए 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;
}
हम भी ऐसा कर सकते हैं:
if (string.matches("^.*?((?i)item1|item2|item3).*$"))
(?i): used for case insensitive
.*? & .*$: used for checking whether it is present anywhere in between the string.
नीचे आपको यह मानकर काम करना चाहिए कि स्ट्रिंग्स वह सरणी है जिसे आप भीतर खोज रहे हैं:
Arrays.binarySearch(Strings,"mykeytosearch",mysearchComparator);
जहां mykeytosearch वह स्ट्रिंग है जिसे आप सरणी के भीतर अस्तित्व के लिए परीक्षण करना चाहते हैं। mysearchComparator - एक तुलनित्र है जिसका उपयोग तार की तुलना करने के लिए किया जाएगा।
अधिक जानकारी के लिए Arrays.binarySearch का संदर्भ लें ।
if (Arrays.asList(array).contains(string))