কোনও স্ট্রিংয়ে অ্যারের থেকে যে কোনও স্ট্রিং রয়েছে কিনা তা পরীক্ষা করুন


153

কোনও অ্যারে থেকে স্ট্রিংগুলির কোনও রয়েছে কিনা তা দেখার জন্য আমি কীভাবে স্ট্রিংটি পরীক্ষা করব?

পরিবর্তে ব্যবহার

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

4
আপনি কি জিজ্ঞাসা করছেন যে স্ট্রিং অ্যারের যে কোনও স্ট্রিংয়ের সমান , বা অ্যারে থেকে স্ট্রিংগুলির কোনও রয়েছে ?
ন্যাটিক্স

1
অ্যারে থেকে কোনও স্ট্রিং আপনার ইনপুট স্ট্রিংয়ের একটি স্ট্রিং কিনা তা আপনি পরীক্ষা করতে চান? বা আপনার ইনপুট স্ট্রিং অ্যারের মধ্যে একটি স্ট্রিংয়ের সমান কিনা তা আপনি পরীক্ষা করতে চান ? আপনি আরও সুনির্দিষ্ট হতে পারেন?
সাবিনো স্টিগরা

1
রয়েছে, যাতে এটি একটি লাইন নিয়ে যায় এবং দেখে যে এটিতে কোনও তালিকা থেকে কোনও শব্দ রয়েছে (স্ট্রিংয়ের অ্যারে হিসাবে সঞ্চিত)
অ্যারোয়েল

উত্তর:


188

সম্পাদনা: জাভা 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
Praneeth

আমরা কীভাবে প্রথম প্রয়োগের ক্ষেত্রে সংবেদনশীল করতে পারি?
thanos.a

বাস্তবায়ন ইতিমধ্যে সংবেদনশীল। উত্তরের নীচের অনুচ্ছেদে কীভাবে এটি কেসকে সংবেদনশীল করা যায় তার জন্য আমারও নির্দেশনা রয়েছে।
21

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

স্ট্রিং ইউটিলস

ব্যবহার করুন:

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

এটি খুঁজে পাওয়া স্ট্রিংয়ের সূচি বা -1 না পাওয়া গেলে ফিরিয়ে দেবে।


7
জেএফআই: আমি আশা করি এই বাস্তবায়নটি কেবল একবার ইনপুটস্ট্রিংয়ের মাধ্যমে পুনরাবৃত্তি হবে, তবে আমি স্ট্রিং ইউটিলেসে কোডটি দেখেছি এবং দুঃখের বিষয় এটি ডিফল্ট ইনডেক্সের এন কলগুলি করছে।
alfonx

সম্ভবত কমন্স 3 এ বাস্তবায়ন আরও ভাল!
রেন্যানলেআন্ডারফ

1
নাহ, এখনও org.apache.commons.lang3.StringUtils এর স্ট্রিংগুলিতে কেবল পুনরাবৃত্তি হয়: (int i = 0; i <searchStrs.length; i++) {CharSequenceUtils.indexOf (str, অনুসন্ধান, 0); ....
alfonx

এটি (অ্যারে থেকে) পাওয়া স্ট্রিংয়ের সূচি ফেরত দেয় না, কেবল স্ট্রিংয়ের অবস্থানের সূচিটি পাওয়া গেছে।
প্লুটো


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
@ বিউগ্রান্থাম আমি এটিও ভাবছিলাম, তবে ওপি .equals()তাদের পোস্টে ব্যবহার করছে, যা অত্যন্ত বিভ্রান্তিকর। আমি মনে করি তাদের প্রশ্নটি সম্পাদনা করতে হবে
জিনোমেড

@ বিউগ্রান্থাম ম্যান আমি শপথ করতে পারছিলাম না আমি সমস্যাটি বুঝতে পারি। হয়তো প্রশ্নটি আরও কিছুটা স্পষ্ট করা দরকার?
রায় কচৌঃ

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); 

একটি আশ্চর্যজনক জিনিস আমি লক্ষ্য করেছি, স্ট্রিং তালিকায় আমার দুটি আইটেম রয়েছে, আমি জানতে পেরেছিলাম, আমি যখন 'সমান্তরাল' ব্যবহার করি তখন এটি সঠিক ফলাফল দেয় না। (এমনকি যদি এটির মান থাকে)।
চার্লসসি

@ চার্লস.সি এটি অদ্ভুত যে আমি আমার পক্ষে পুনরুত্পাদন করতে পারি না।
নিকোলাস ফিলোটো

আমি দৃ sure়ভাবে নিশ্চিত যে স্ট্র্যাপটির সমান্তরালকরণ এখানে ইনপুটমেটাল হবে যদি না ইনপুট স্ট্রিং দীর্ঘ হয় (~ 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

আরও গ্রোভয়েস্কো পদ্ধতির সাথে মেটাচ্লাসের সংমিশ্রণে ইনজেকশন ব্যবহার করা হবে :

আমি বলতে ভালোবাসি:

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)})
}

আপনার যদি ভবিষ্যতের কোনও স্ট্রিং ভেরিয়েবলের জন্য উপস্থিত থাকার জন্য কোনও দরকার থাকে তবে অবজেক্টটির পরিবর্তে ক্লাসে পদ্ধতিটি যুক্ত করুন:

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


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);

যেখানে মাইকিটোসার্ক হল সেই স্ট্রিং যা আপনি অ্যারের মধ্যে অস্তিত্বের জন্য পরীক্ষা করতে চান। mysearchComparator - একটি তুলনামূলক যা স্ট্রিংগুলি তুলনা করতে ব্যবহৃত হবে।

পড়ুন Arrays.binarySearch আরও তথ্যের জন্য।


2
এটি লক্ষ করা উচিত যে বাইনারি অনুসন্ধান কেবল সাজানো অ্যারেগুলিতে কাজ করে যা প্রাকৃতিকভাবে বা প্রদত্ত তুলনাকারীর দ্বারা (যদি দেওয়া হয়)।
ন্যাটিক্স

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.