জাভাতে কোনও অ্যারেতে একটি নির্দিষ্ট মান রয়েছে কিনা তা আমি কীভাবে নির্ধারণ করব?


2274

এর String[]মতো মান সহ আমার আছে :

public static final String[] VALUES = new String[] {"AB","BC","CD","AE"};

দেওয়া আছে String s, VALUESরয়েছে কিনা তা পরীক্ষা করার কোনও ভাল উপায় আছে s?


5
এর চারদিকে দীর্ঘ পথ, তবে আপনি লুপের জন্য একটি ব্যবহার করতে পারেন: "(স্ট্রিং এর: ভ্যালু) জন্য যদি (s.equals (" MYVALUE ")) সত্য ফিরে আসে;
জ্যাক

70
@camickr। আপনার প্রশ্নের কাছে, আমি এই প্রশ্নটি এবং আপনার উত্তরটিকে উজ্জীবিত করেছি - কারণ এটি আমাকে 30 মিনিট এবং 20 টি লাইন কোড লেখার লুপগুলির জন্য কুৎসিতভাবে সাশ্রয় করেছে, - এখন-। তিন বছর আগে এটি পড়েনি। (BTW, ধন্যবাদ :))
সাধনা

3
@ camickr - আমি এই এক সঙ্গে একটি প্রায় অভিন্ন অবস্থা আছে: stackoverflow.com/a/223929/12943 এটা ঠিক ভোট পেয়ে রাখে এখনো শুধু একটি কপি / সূর্যের নথিপত্র থেকে পেস্ট ছিল। আমার ধারণা, স্কোর আপনি কতটা সহায়তা সরবরাহ করেছেন এবং এর মধ্যে আপনি কতটা প্রচেষ্টা চালিয়েছেন তার উপর ভিত্তি করে - এবং আপনি এটি কত দ্রুত পোস্ট করেছেন! হয়তো আমরা জন স্কিটির গোপনীয়তায় হোঁচট খেয়েছি! ভাল উত্তর, আপনার জন্য +1।
বিল কে

1
আপনি যদি অ্যাপাচি কমন্স ব্যবহার করেন তবে org.apache.commons.lang.ArrayUtils.contains () এটি আপনার জন্য করে।
মিঃ বয়

34
@ ক্যামিকার কারণ আমার মতো লোকেরা, একটি প্রশ্ন গুগল করে, এসও ফলাফলটিতে ক্লিক করে আপনার উত্তরটি দেখুন, এটি পরীক্ষা করুন, এটি কার্যকর হয়, উত্তরটিকে উর্ধ্বতন করে এবং তারপরে চলে যায়।
অ্যাকুইটাস

উত্তর:


2919
Arrays.asList(yourArray).contains(yourValue)

সতর্কতা: এটি আদিমদের অ্যারেগুলির জন্য কাজ করে না (মন্তব্যগুলি দেখুন)।


থেকে আপনি এখন স্ট্রিম ব্যবহার করতে পারেন।

String[] values = {"AB","BC","CD","AE"};
boolean contains = Arrays.stream(values).anyMatch("s"::equals);

কি না চেক করতে একটি অ্যারের int, doubleবা longএকটি মান ব্যবহার রয়েছে IntStream, DoubleStreamবা LongStreamযথাক্রমে।

উদাহরণ

int[] a = {1,2,3,4};
boolean contains = IntStream.of(a).anyMatch(x -> x == 4);

87
অ্যারে ক্লাসে অনুসন্ধানের ফাংশনগুলির বনাম কোনও অ্যারের উপরে পুনরাবৃত্তি করা এবং আদিমদের জন্য সমান () ফাংশন বা == ব্যবহার করে আমি এর বিপরীতে অভিনয় সম্পর্কে কিছুটা কৌতূহলী।
থমাস

186
আপনি বেশি হারাবেন না, কারণ ASList () একটি অ্যারেলিস্ট ফিরিয়ে দেয় যার হৃদয়ে একটি অ্যারে রয়েছে। কনস্ট্রাক্টর কেবল একটি রেফারেন্স পরিবর্তন করবে যাতে সেখানে কাজ করার মতো বেশি কাজ হয় না। এবং () / indexOf () এতে পুনরাবৃত্তি হবে এবং সমান () ব্যবহার করবে। আদিমদের জন্য আপনার নিজের কোডিং করা ভাল though স্ট্রিংস বা অন্যান্য শ্রেণীর জন্য, পার্থক্যটি লক্ষণীয় হবে না।
জোয়

18
অদ্ভুত, নেটবিয়ানস দাবি করেছে যে 'অ্যারেজ.এললিস্ট (ছুটির দিনগুলি') 'ইনট [] ছুটির দিনে' একটি 'তালিকা <int []>' ফিরিয়ে দেয়, কোনও 'তালিকা <<> নয়'। এটিতে কেবল একটি একক উপাদান রয়েছে। কনটেন্টগুলি বোঝায় না কারণ এটির একটি মাত্র উপাদান রয়েছে; ইনট অ্যারে।
নায়ারগডস

62
নায়ারগডস: প্রকৃতপক্ষে, এটি আদিমদের পক্ষে কাজ করে না। জাভা আদিম ধরণের জেনেরিক হতে পারে না। asList <T> তালিকা <টি> asList (টি ...) হিসাবে ঘোষণা করা হয়। আপনি যখন এটির কোনও প্রবেশ [পাস] করেন, সংকলক টি = ইনট [] অনুমান করে কারণ এটি টি = ইনট অনুমান করতে পারে না, কারণ আদিমগুলি জেনেরিক হতে পারে না।
ক্রোমডেস্ট্রোয়ার

28
@Joey শুধু একটি সাইড নোট, এটি একটি এর ArrayList, কিন্তু না java.util.ArrayListআশা হিসাবে, বাস্তব বর্গ ফিরিয়ে দেওয়া হয়: java.util.Arrays.ArrayList<E>হিসাবে সংজ্ঞায়িত: public class java.util.Arrays {private static class ArrayList<E> ... {}}
TWiStErRob

362

জাভা এসই 9 এর জন্য সংক্ষিপ্ত আপডেট

রেফারেন্স অ্যারেগুলি খারাপ। এই ক্ষেত্রে আমরা একটি সেট পরে। জাভা এসই 9 এর পরে আমাদের রয়েছে Set.of

private static final Set<String> VALUES = Set.of(
    "AB","BC","CD","AE"
);

"স্ট্রিং গুলি দেওয়া আছে, ভ্যালুতে এস রয়েছে কিনা তা পরীক্ষা করার কোনও ভাল উপায় আছে?"

VALUES.contains(s)

হে (1)।

সঠিক প্রকারের , অপরিবর্তনীয় , হে (1) এবং সংক্ষিপ্ত । সুন্দর। *

মূল উত্তর বিশদ

শুরু করার জন্য কেবল কোড সাফ করার জন্য। আমরা (সংশোধন) করেছি:

public static final String[] VALUES = new String[] {"AB","BC","CD","AE"};

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

private static final String[] VALUES = new String[] {"AB","BC","CD","AE"};

(দ্রষ্টব্য, আপনি আসলে new String[];কিছুটা বাদ দিতে পারেন ))

রেফারেন্স অ্যারেগুলি এখনও খারাপ এবং আমরা একটি সেট চাই:

private static final Set<String> VALUES = new HashSet<String>(Arrays.asList(
     new String[] {"AB","BC","CD","AE"}
));

(আমার মতো প্যারানয়েড লোকেরা যদি এটিকে আবৃত করা হয় তবে আরও স্বাচ্ছন্দ্য বোধ করতে Collections.unmodifiableSetপারে - এটি তখন প্রকাশ্যেও প্রকাশ করা যেতে পারে))

(* ব্র্যান্ডের আরও কিছুটা হলেও, সংগ্রহের এপিআই অনুমিতভাবে এখনও অপরিবর্তনীয় সংগ্রহের ধরণগুলি হারিয়েছে এবং বাক্য গঠনটি আমার স্বাদের জন্য এখনও খুব ভার্জোজ।)


183
প্রথম স্থানে সংগ্রহটি তৈরি করা ও (এন) ব্যতীত :)
ড্রু নোকস

60
যদি এটি স্থির থাকে তবে এটি সম্ভবত বেশ কয়েকবার ব্যবহৃত হতে পারে। সুতরাং, সেটটি শুরু করতে ব্যয় করা সময়টিতে প্রচুর লিনিয়ার অনুসন্ধানগুলির ব্যয়ের তুলনায় বেশ ছোট হওয়ার সম্ভাবনা রয়েছে।
এক্সআর

1
এরপরে সংগ্রহটি কোড লোডিং টাইমের (যা প্রযুক্তিগতভাবে ও (এন) তবে ব্যবহারিকভাবে ধ্রুবক) দ্বারা প্রাধান্য পাবে।
টম হাটিন -

2
@ টমহাউটিন-ট্যাকলাইন আপনি কেন "বিশেষত আমরা একটি সেট চাই" বলছেন? এক্ষেত্রে একটি সেট (হ্যাশসেট) এর সুবিধা কী? একটি "রেফারেন্স অ্যারে" খারাপ কেন ("রেফারেন্স অ্যারে" দ্বারা আপনি কী কোনও অ্যারে দ্বারা সমর্থনযুক্ত একটি অ্যারেলিস্টকে কল দ্বারা উত্পন্ন হিসাবে বোঝাচ্ছেন Arrays.asList)?
তুলিল বাউর্ক

6
@nmr এ TreeSetহবে O(log n)HashSetগুলিগুলি এমনভাবে মাপা হয় যে একটি বালতিতে উপাদানের গড় সংখ্যা মোটামুটি ধ্রুবক। কমপক্ষে 2 ^ 30 পর্যন্ত অ্যারেগুলির জন্য। বলা যেতে পারে যে হার্ডওয়ার ক্যাশেগুলি থেকে বিগ-ও বিশ্লেষণ উপেক্ষা করা হতে পারে। ধরে নেয় হ্যাশ ফাংশন কার্যকরভাবে কাজ করছে।
টম হাটিন -

206

আপনি অ্যাপাচি কমন্স ল্যাংArrayUtils.contains থেকে ব্যবহার করতে পারেন

public static boolean contains(Object[] array, Object objectToFind)

নোট করুন যে falseপাস করা অ্যারে থাকলে এই পদ্ধতিটি ফিরে আসে null

সমস্ত ধরণের আদিম অ্যারেগুলির জন্যও উপলব্ধ পদ্ধতি রয়েছে।

উদাহরণ:

String[] fieldsToInclude = { "id", "name", "location" };

if ( ArrayUtils.contains( fieldsToInclude, "id" ) ) {
    // Do some stuff.
}

4
@ সর্বোচ্চ 4 আমি সম্মত, তবে এটি "নিজের নিজের ঘূর্ণায়মান" এবং এর পরে কাঁচা জাভা উপায়ে পড়া আরও সহজ।
জেসন


38
@ সর্বোচ্চ 4 কখনও কখনও আপনার কাছে ইতিমধ্যে এই লাইব্রেরিটি অন্তর্ভুক্ত রয়েছে (অন্যান্য কারণে) এবং এটি একটি সম্পূর্ণ বৈধ উত্তর। আমি এটি খুঁজছিলাম এবং আমি ইতিমধ্যে অ্যাপাচি কমন্স ল্যাং এর উপর নির্ভরশীল। এই উত্তরের জন্য ধন্যবাদ।
গুইসিম

1
অথবা আপনি কেবল পদ্ধতিটি অনুলিপি করতে পারেন (এবং যদি থাকে তবে অবনতি)।
মহিষ

10
@ সর্বাধিক অ্যান্ড্রয়েড অ্যাপ্লিকেশনগুলি প্রুগার্ড দ্বারা ন্যূনতম করা হয়, আপনার অ্যাপ্লিকেশনটিতে আপনার প্রয়োজনীয় ক্লাস এবং ফাংশনগুলি রাখে। এটি আপনার নিজের রোল করার সমান করে দেয় বা অ্যাপাচি জিনিসটির উত্স অনুলিপি করে। এবং যে কেউ এই সংক্ষিপ্তকরণটি ব্যবহার করে না তার 700kb বা 78kb সম্পর্কে অভিযোগ করার দরকার নেই :)
কেনিয়াকর্ন কেটসম্বট

158

কেবল হাতে হাতে এটি প্রয়োগ করুন:

public static <T> boolean contains(final T[] array, final T v) {
    for (final T e : array)
        if (e == v || v != null && v.equals(e))
            return true;

    return false;
}

লিখেছেন:

v != nullশর্ত পদ্ধতি ভিতরে ধ্রুবক। পদ্ধতি কলের সময় এটি সর্বদা একই বুলিয়ান মানকে মূল্যায়ন করে। সুতরাং যদি ইনপুটটি arrayবড় হয় তবে কেবল একবারই এই শর্তটি মূল্যায়ন করা আরও দক্ষ forএবং ফলাফলের উপর ভিত্তি করে আমরা লুপের অভ্যন্তরে একটি সরলীকৃত / দ্রুত শর্ত ব্যবহার করতে পারি । উন্নত contains()পদ্ধতি:

public static <T> boolean contains2(final T[] array, final T v) {
    if (v == null) {
        for (final T e : array)
            if (e == null)
                return true;
    } 
    else {
        for (final T e : array)
            if (e == v || v.equals(e))
                return true;
    }

    return false;
}

9
@ ফয়েক্সো এই সমাধানটি স্পষ্টতই দ্রুততর কারণ গ্রহণযোগ্য উত্তরগুলি অ্যারেটিকে একটি তালিকায় আবদ্ধ করে এবং সেই তালিকাতে থাকা () পদ্ধতিটিকে কল করে যখন আমার সমাধানটি মূলত যা করে তা কেবল () করে।
আইজজা

10
@ অ্যালেস্টারমুডি ই == ভি একটি রেফারেন্স সমতা পরীক্ষা করে যা খুব দ্রুত fast একই বস্তু (রেফারেন্স অনুসারে একই) অ্যারেতে থাকলে এটি দ্রুত পাওয়া যাবে। যদি এটি একই উদাহরণ না হয় তবে এটি সমান () পদ্ধতির দ্বারা দাবি করা হিসাবে একই হতে পারে, রেফারেন্সগুলি একই নয় তবে এটি যাচাই করা হয়।
আইজজা

20
কেন জাভা এই ফাংশন অংশ না? লোকেরা জাভা ফুলে গেছে বলে আশ্চর্যের কিছু নেই ... উপরের সমস্ত উত্তরগুলি দেখুন যা আপনার প্রয়োজন সমস্ত লুপের জন্য যখন গ্রন্থাগারগুলির একগুচ্ছ ব্যবহার করে। আজকের দিনের শিশুরা!
ফ্রেইকহেড

4
@ ফ্রেইকহেড এটি জাভার অংশ, দেখুনCollection.contains(Object)
স্টিভ কুও

11
@ আইকিজা আপনি যদি উত্সটির দিকে তাকান Arraysএবং ArrayListএটি প্রমাণিত হয় যে এটি ব্যবহার করা সংস্করণটির চেয়ে অগত্যা দ্রুত নয় Arrays.asList(...).contains(...)। একটি তৈরির ওভারহেড ArrayListঅত্যন্ত ছোট এবং ArrayList.contains()এটি উপরে দেখানো (জেডিকে)) এর চেয়ে বেশি স্মার্ট লুপ ব্যবহার করে (আসলে এটি দুটি ভিন্ন লুপ ব্যবহার করে)।
এক্সেল

72

অ্যারেতে একটি মান রয়েছে কিনা তা পরীক্ষা করার জন্য চারটি ভিন্ন উপায়

1) তালিকা ব্যবহার করে:

public static boolean useList(String[] arr, String targetValue) {
    return Arrays.asList(arr).contains(targetValue);
}

2) সেট ব্যবহার:

public static boolean useSet(String[] arr, String targetValue) {
    Set<String> set = new HashSet<String>(Arrays.asList(arr));
    return set.contains(targetValue);
}

3) একটি সাধারণ লুপ ব্যবহার:

public static boolean useLoop(String[] arr, String targetValue) {
    for (String s: arr) {
        if (s.equals(targetValue))
            return true;
    }
    return false;
}

4) অ্যারে.বাইনারি অনুসন্ধান () ব্যবহার করে:

নীচের কোডটি ভুল, এটি সম্পূর্ণতার জন্য এখানে তালিকাভুক্ত। বাইনারি অনুসন্ধান () কেবলমাত্র সাজানো অ্যারে ব্যবহার করা যেতে পারে। আপনি ফলাফলটি নীচে অদ্ভুত দেখতে পাবেন। অ্যারে বাছাই করার সময় এটি সেরা বিকল্প।

public static boolean binarySearch(String[] arr, String targetValue) {  
            int a = Arrays.binarySearch(arr, targetValue);
            return a > 0;
        }

দ্রুত উদাহরণ:

String testValue="test";
String newValueNotInList="newValue";
String[] valueArray = { "this", "is", "java" , "test" };
Arrays.asList(valueArray).contains(testValue); // returns true
Arrays.asList(valueArray).contains(newValueNotInList); // returns false

5
আপনার বাইনারি অনুসন্ধান উদাহরণটি একটি> 0;
শেরউড

6
কেন? আমি মনে করি এটি একটি> -1 ফেরত উচিত, যেহেতু 0 ইঙ্গিত করে যে এটি অ্যারের শীর্ষে রয়েছে।
এমবাও

1
প্রথম বৈকল্পিকটি (a >= 0)সঠিক ছিল, কেবলমাত্র দস্তাবেজগুলি পরীক্ষা করুন , তারা বলছেন "নোটটি এটি গ্যারান্টি দেয় যে রিটার্নের মান> = 0 হবে এবং কেবল যদি চাবি পাওয়া যায় তবে"।
ইওুরি এন।

স্ট্রিং-এ কাজ করে না কেন? স্ট্যাটিক বুলিয়ান বিদ্যমান (int [] ints, int k) {ফেরত Arrays.asList (ints) .contains (k); }
উইলিয়ান্স মার্টিনস

71

অ্যারেটি বাছাই না করা থাকলে আপনাকে সমস্ত কিছুর উপরে পুনরাবৃত্তি করতে হবে এবং প্রতিটিটির সমানতে কল করতে হবে।

অ্যারে বাছাই করা থাকলে, আপনি বাইনারি অনুসন্ধান করতে পারেন, অ্যারে ক্লাসে একটি আছে।

সাধারণভাবে বলতে গেলে, আপনি যদি অনেক সদস্যতার চেক করতে চলেছেন তবে আপনি অ্যারে না রেখে সমস্ত কিছু সেটতে সঞ্চয় করতে পারেন।


1
এছাড়াও, যেমনটি আমি আমার উত্তরে বলেছিলাম, আপনি যদি অ্যারে ক্লাস ব্যবহার করেন তবে আপনি অ্যারে বাছাই করতে পারেন তবে নতুন সাজানো অ্যারেতে বাইনারি অনুসন্ধান করুন।
টমাস

1
@ থমাস: আমি একমত অথবা আপনি কেবল একটি ট্রিসেটে সমস্ত কিছু যুক্ত করতে পারেন; একই জটিলতা অ্যারেগুলি পরিবর্তন না হলে আমি ব্যবহার করব (রেফারেন্সগুলি স্বতন্ত্রভাবে সজ্জিত হলেও স্ট্রিংগুলি না থাকলেও কিছুটা মেমরি লোকাল সংরক্ষণ করুন)। সময়ের সাথে সাথে যদি এটি পরিবর্তন হয় তবে আমি সেটটি ব্যবহার করব।
উড়ি

49

এটির মূল্য কীসের জন্য আমি গতির 3 টি পরামর্শের সাথে তুলনা করে একটি পরীক্ষা চালিয়েছি। আমি এলোমেলো পূর্ণসংখ্যার উত্পন্ন করেছি, সেগুলিকে একটি স্ট্রিংয়ে রূপান্তর করেছি এবং সেগুলিকে একটি অ্যারেতে যুক্ত করেছি। তারপরে আমি সর্বাধিক সম্ভাব্য সংখ্যা / স্ট্রিং অনুসন্ধান করেছি, যা এটির জন্য সবচেয়ে খারাপ পরিস্থিতি হবে asList().contains()

10 কে অ্যারে আকার ব্যবহার করার সময় ফলাফলগুলি ছিল:

বাছাই করুন এবং অনুসন্ধান করুন: 15
বাইনারি অনুসন্ধান: 0
asList.contains: 0

100K অ্যারে ব্যবহার করার সময় ফলাফলগুলি ছিল:

বাছাই করুন এবং অনুসন্ধান করুন: 156
বাইনারি অনুসন্ধান: 0
asList.contains: 32

সুতরাং যদি সাজান অনুসারে অ্যারে তৈরি করা হয় তবে বাইনারি অনুসন্ধানটি দ্রুততম, অন্যথায় asList().containsযাওয়ার উপায় হবে। আপনার যদি অনেকগুলি অনুসন্ধান থাকে তবে অ্যারে বাছাই করা সার্থক হতে পারে যাতে আপনি বাইনারি অনুসন্ধানটি ব্যবহার করতে পারেন। এটি সব আপনার আবেদনের উপর নির্ভর করে।

আমি মনে করি সেগুলিই বেশিরভাগ লোকেরা প্রত্যাশা করবে। পরীক্ষার কোডটি এখানে:

import java.util.*;

public class Test
{
    public static void main(String args[])
    {
        long start = 0;
        int size = 100000;
        String[] strings = new String[size];
        Random random = new Random();


        for (int i = 0; i < size; i++)
            strings[i] = "" + random.nextInt( size );

        start = System.currentTimeMillis();
        Arrays.sort(strings);
        System.out.println(Arrays.binarySearch(strings, "" + (size - 1) ));
        System.out.println("Sort & Search : " + (System.currentTimeMillis() - start));

        start = System.currentTimeMillis();
        System.out.println(Arrays.binarySearch(strings, "" + (size - 1) ));
        System.out.println("Search        : " + (System.currentTimeMillis() - start));

        start = System.currentTimeMillis();
        System.out.println(Arrays.asList(strings).contains( "" + (size - 1) ));
        System.out.println("Contains      : " + (System.currentTimeMillis() - start));
    }
}

6
আমি এই কোড বুঝতে পারি না। আপনি অ্যারের 'স্ট্রিংস' সাজান এবং বাইনারি অনুসন্ধানে উভয় কলগুলিতে একই (সাজানো) অ্যারে ব্যবহার করেন। কীভাবে এটি হটস্পট রানটাইম অপ্টিমাইজেশন ব্যতীত অন্য কিছু দেখায়? AsList.contains কলের সাথে একই। আপনি বাছাই করা অ্যারে থেকে একটি তালিকা তৈরি করেন এবং তারপরে এটিতে সর্বাধিক মান সহ থাকে। অবশ্যই এটি সময় নিতে যাচ্ছে। এই পরীক্ষার অর্থ কী? একটি ভুলভাবে লিখিত মাইক্রোবেনমার্ক হিসাবে উল্লেখ করার দরকার নেই
এরিক

এছাড়াও, যেহেতু বাইনারি অনুসন্ধান কেবল একটি সাজানো সেটগুলিতে প্রয়োগ করা যায়, তাই বাইনারি অনুসন্ধান ব্যবহারের একমাত্র সম্ভাব্য উপায় বাছাই এবং অনুসন্ধান
এরিক

বাছাই করা ইতিমধ্যে বেশ কয়েকটি অন্যান্য কারণে সম্পন্ন হতে পারে, যেমন, এটি init এ বাছাই করা যেতে পারে এবং কখনই পরিবর্তন করা যায় না। নিজস্ব অনুসন্ধানের সময়টি পরীক্ষায় ব্যবহার রয়েছে। এটি যেখানে নেমে আসে তবে এটি মাইক্রোব্যাঙ্কমার্কিংয়ের দুর্দান্ত উদাহরণগুলির চেয়ে কম। মাইক্রোব্যাঙ্কমার্কগুলি জাভাতে ডান পেতে কুখ্যাতভাবে জটিল এবং উদাহরণস্বরূপ, সত্যিকারের পরীক্ষা চালানোর আগে হটস্পট অপ্টিমাইজেশন পাওয়ার জন্য টেস্ট কোডটি কার্যকর করা অন্তর্ভুক্ত হওয়া উচিত, কেবল টাইমারের সাহায্যে ওয়ানসিইএসের চেয়ে বেশি আসল পরীক্ষার কোডটি চালানো উচিত।
সমস্যাগুলি

7
একই জেভিএম ইনস্ট্যান্সে এটি 3 টি পরীক্ষা চালায় বলে এই পরীক্ষাটি ত্রুটিযুক্ত । পরবর্তী পরীক্ষাগুলি ক্যাশে, জেআইটি ইত্যাদিকে উষ্ণ করার পূর্ববর্তীগুলির দ্বারা উপকৃত হতে পারে
স্টিভ কুও

4
এই পরীক্ষাটি আসলে সম্পূর্ণ সম্পর্কিত নয় re বাছাই করুন এবং অনুসন্ধান লিনিয়ারীথমিক (এন * লগ (এন)) জটিলতা, বাইনারি অনুসন্ধান লোগারিদমিক এবং অ্যারে ইউটিলস কনটেনগুলি স্পষ্টতই রৈখিক। এই সমাধানগুলি তুলনা করার কোনও সুবিধা নেই কারণ এগুলি সম্পূর্ণ ভিন্ন জটিলতার ক্লাসে।
ড্র্যাগ করুন

37

দ্রুত অ্যারে প্রারম্ভিককরণ সিনট্যাক্সটি ব্যবহার করার পরিবর্তে, আপনি সরাসরি অ্যারেএস.এললিস্ট পদ্ধতিটি ব্যবহার করে অনুরূপভাবে সরাসরি তালিকা হিসাবে সূচনা করতে পারেন, যেমন:

public static final List<String> STRINGS = Arrays.asList("firstString", "secondString" ...., "lastString");

তারপরে আপনি (উপরের মত) করতে পারেন:

STRINGS.contains("the string you want to find");

35

জাভা 8 এর সাহায্যে আপনি একটি স্ট্রিম তৈরি করতে পারেন এবং স্ট্রিমের কোনও এন্ট্রি মেলে কিনা তা পরীক্ষা করতে পারেন "s":

String[] values = {"AB","BC","CD","AE"};
boolean sInArray = Arrays.stream(values).anyMatch("s"::equals);

বা জেনেরিক পদ্ধতি হিসাবে:

public static <T> boolean arrayContains(T[] array, T value) {
    return Arrays.stream(array).anyMatch(value::equals);
}

3
এটি আদিম বিশেষত্বগুলিও লক্ষ করার মতো।
স্কিভি

যোগ করার জন্য, anyMatchজাভাডক এটি জানিয়েছে যে এটি "...May not evaluate the predicate on all elements if not necessary for determining the result."কোনও মিল খুঁজে পাওয়ার পরে প্রক্রিয়া চালিয়ে যাওয়ার প্রয়োজন হতে পারে না।
mkobit

28

মানটির জন্য বাইনারি অনুসন্ধান করতে আপনি অ্যারে ক্লাস ব্যবহার করতে পারেন । যদি আপনার অ্যারে বাছাই না করা হয়, আপনাকে অ্যারে বাছাই করতে একই শ্রেণিতে বাছাই করা ফাংশনগুলি ব্যবহার করতে হবে, তারপরে এটি অনুসন্ধান করুন।


আপনি এটি সম্পাদন করতে একই শ্রেণীর মধ্যে বাছাই ফাংশন ব্যবহার করতে পারেন ... আমার উত্তরটিতে এটি যুক্ত করা উচিত।
থমাস

1
সম্ভবত asList ()। এর মধ্যে () পদ্ধতির চেয়ে বেশি ব্যয় হবে, তবে আমি মনে করি। যদি আপনার এটি পরীক্ষা না করা হয় তবে আপনি এটি প্রায়শই করতে পারবেন না (তবে এটি যদি মানগুলির একটি স্থির তালিকা থাকে যা শুরুতে সাজানো যায়, ন্যায্য হবে)।
জোয়

সত্য। সর্বাধিক কার্যকর হবে যা হিসাবে অনেকগুলি ভেরিয়েবল রয়েছে। বিকল্প থাকলেও ভাল।
থমাস

কিছু কোড যা এই এখানে আছে: stackoverflow.com/a/48242328/9131078
OOBalance

কোনও অনুসন্ধানের উদ্দেশ্যে পুরো অ্যারে বাছাই করা ব্যয়বহুল। লাইনার অনুসন্ধানের জন্য আমরা একই সিপিইউ সময়টি ব্যবহার করতে পারি। আমি ইতিমধ্যে পূর্বে সাজানো ক্রমে নির্মিত একটি সংগ্রহের উপর বাইনারি অনুসন্ধান পছন্দ করি।
অরুনভিথাশমাইল

17

ওবস্টুপিডএনসওয়ার (তবে আমি মনে করি এখানে কোথাও একটি পাঠ রয়েছে):

enum Values {
    AB, BC, CD, AE
}

try {
    Values.valueOf(s);
    return true;
} catch (IllegalArgumentException exc) {
    return false;
}

1
ব্যতিক্রম ছোঁড়া আপাতদৃষ্টিতে ভারী তবে এটি যদি মানটি কাজ করে তবে এটি পরীক্ষার একটি অভিনব উপায়। ক্ষতিটি হ'ল এনামকে আগেই সংজ্ঞায়িত করতে হবে।
জেমস পি

13

প্রকৃতপক্ষে, আপনি যদি টম হাটিন প্রস্তাবিত হিসাবে হ্যাশसेट <স্ট্রিং> ব্যবহার করেন তবে আপনাকে বাছাইয়ের বিষয়ে চিন্তা করার দরকার নেই, এবং আপনার গতি সম্ভবত পূর্বনির্ধারিত অ্যারেতে বাইনারি অনুসন্ধানের মতো, সম্ভবত আরও তত দ্রুত faster

এটি সমস্ত কিছুর উপর নির্ভর করে আপনার কোডটি কীভাবে সেট আপ করা যায়, স্পষ্টতই, তবে আমি যেখান থেকে দাঁড়িয়ে আছি তাতে আদেশটি হবে:

একটি অমীমাংসিত অ্যারে:

  1. HashSet
  2. asList
  3. বাছাই করুন এবং বাইনারি

সাজানো অ্যারেতে:

  1. HashSet
  2. বাইনারি
  3. asList

সুতরাং যেভাবেই হোক, হ্যাশসেটটি জয়ের জন্য।


2
হ্যাশসেটের সদস্যপদটি ও (1) হওয়া উচিত এবং বাছাই করা সংগ্রহে বাইনারি অনুসন্ধান হ'ল (লগ এন)।
স্কাইলার সেভল্যান্ড

11

আপনার যদি গুগল সংগ্রহের লাইব্রেরি থাকে তবে টম এর উত্তর ইমটুয়েটসেট (http://google-colલેક્.g.ggglecode.com/svn/trunk/javadoc/com/google/common/collect/ImmutableSet.html) ব্যবহার করে অনেক সরল করা যায় can

এটি প্রস্তাবিত সূচনা থেকে সত্যই প্রচুর গোলমাল সরিয়ে দেয়

private static final Set<String> VALUES =  ImmutableSet.of("AB","BC","CD","AE");

10

একটি সম্ভাব্য সমাধান:

import java.util.Arrays;
import java.util.List;

public class ArrayContainsElement {
  public static final List<String> VALUES = Arrays.asList("AB", "BC", "CD", "AE");

  public static void main(String args[]) {

      if (VALUES.contains("AB")) {
          System.out.println("Contains");
      } else {
          System.out.println("Not contains");
      }
  }
}

8

বিকাশকারীরা প্রায়শই এটি করেন:

Set<String> set = new HashSet<String>(Arrays.asList(arr));
return set.contains(targetValue);

উপরের কোডটি কাজ করে তবে প্রথমে সেট করার জন্য কোনও তালিকা রূপান্তর করার দরকার নেই। একটি তালিকা একটি সেটে রূপান্তর করতে অতিরিক্ত সময় প্রয়োজন। এটি হিসাবে সহজ করতে পারেন:

Arrays.asList(arr).contains(targetValue);

অথবা

   for(String s: arr){
        if(s.equals(targetValue))
            return true;
    }

return false;

প্রথমটি দ্বিতীয়টির চেয়ে বেশি পঠনযোগ্য।


7

একটি সাধারণ লুপ ব্যবহার করা এটি করার সবচেয়ে কার্যকরী উপায়।

boolean useLoop(String[] arr, String targetValue) {
    for(String s: arr){
        if(s.equals(targetValue))
            return true;
    }
    return false;
}

সৌজন্যে প্রোগ্রামক্রিকে


অ্যারে লক্ষ্য মানের পূর্বে নাল রেফারেন্স উপস্থিত থাকলে এটি একটি নাল পয়েন্টার ব্যতিক্রম ছুঁড়ে ফেলবে।
স্যামুয়েল এডউইন ওয়ার্ড

1
যদি বিবৃতিটি হ'ল: যদি (টার্গেটভ্যালিউ.ইকোয়্যালস) গুলি স্ট্রিংয়ের সমান একটি উদাহরণস্বরূপ পরীক্ষক থাকে।
দ্য আর্চন

নাল নিরাপদে থাকার পরিবর্তে অবজেক্টস.ইক্যুয়ালস (obj1, obj2) ব্যবহার করুন।
ট্রিলজি

7

ইন জাভা 8 প্রবাহের ব্যবহার করুন।

List<String> myList =
Arrays.asList("a1", "a2", "b1", "c2", "c1");

myList
.stream()
.filter(s -> s.startsWith("c"))
.map(String::toUpperCase)
.sorted()
.forEach(System.out::println);

7
এই পদ্ধতির সাথে কি কোনও সুবিধা আছে?
জোহানেস স্টাডলার

1
এটি প্রশ্নের উত্তর দেয় না।
ফ্লোরিয়ান এফ

5
  1. সীমিত দৈর্ঘ্যের অ্যারেগুলির জন্য নিম্নলিখিতটি ( ক্যামিকার দ্বারা প্রদত্ত ) ব্যবহার করুন। এটি পুনরাবৃত্ত চেকগুলির জন্য ধীরে ধীরে, বিশেষত দীর্ঘতর অ্যারেগুলির জন্য (লিনিয়ার সন্ধান)।

     Arrays.asList(...).contains(...)
  2. দ্রুত পারফরম্যান্সের জন্য যদি আপনি বারবার বড় উপাদানগুলির বিরুদ্ধে পরীক্ষা করেন

    • একটি অ্যারে হ'ল ভুল কাঠামো। একটি ব্যবহার করুন TreeSetএবং এতে প্রতিটি উপাদান যুক্ত করুন। এটি উপাদানগুলি সাজায় এবং একটি দ্রুত exist()পদ্ধতি রয়েছে (বাইনারি অনুসন্ধান))

    • যদি উপাদানগুলি প্রয়োগ করে Comparableএবং আপনি সেই TreeSetঅনুযায়ী বাছাই করতে চান :

      ElementClass.compareTo()পদ্ধতির সাথে অবশ্যই তুলনামূলক হতে হবে ElementClass.equals(): দেখুন ট্রায়ড লড়াইয়ের জন্য প্রদর্শিত হচ্ছে না? (জাভা সেট একটি আইটেম অনুপস্থিত)

      TreeSet myElements = new TreeSet();
      
      // Do this for each element (implementing *Comparable*)
      myElements.add(nextElement);
      
      // *Alternatively*, if an array is forceably provided from other code:
      myElements.addAll(Arrays.asList(myArray));
    • অন্যথায়, আপনার নিজের ব্যবহার করুন Comparator:

      class MyComparator implements Comparator<ElementClass> {
           int compareTo(ElementClass element1; ElementClass element2) {
                // Your comparison of elements
                // Should be consistent with object equality
           }
      
           boolean equals(Object otherComparator) {
                // Your equality of comparators
           }
      }
      
      
      // construct TreeSet with the comparator
      TreeSet myElements = new TreeSet(new MyComparator());
      
      // Do this for each element (implementing *Comparable*)
      myElements.add(nextElement);
    • পরিশোধ: কিছু উপাদান চেক অস্তিত্ব:

      // Fast binary search through sorted elements (performance ~ log(size)):
      boolean containsElement = myElements.exists(someElement);

4
কেন বিরক্ত করবেন TreeSet? HashSetদ্রুত (O (1)) এবং এর ক্রম প্রয়োজন হয় না।
শন ওভেন

4

এটা চেষ্টা কর:

ArrayList<Integer> arrlist = new ArrayList<Integer>(8);

// use add() method to add elements in the list
arrlist.add(20);
arrlist.add(25);
arrlist.add(10);
arrlist.add(15);

boolean retval = arrlist.contains(10);
if (retval == true) {
    System.out.println("10 is contained in the list");
}
else {
    System.out.println("10 is not contained in the list");
}

4

নিম্নলিখিতটি ব্যবহার করুন ( contains()পদ্ধতিটি ArrayUtils.in()এই কোডটিতে রয়েছে):

ObjectUtils.java

public class ObjectUtils{

    /**
     * A null safe method to detect if two objects are equal.
     * @param object1
     * @param object2
     * @return true if either both objects are null, or equal, else returns false.
     */
    public static boolean equals(Object object1, Object object2){
        return object1==null ? object2==null : object1.equals(object2);
    }

}

ArrayUtils.java

public class ArrayUtils{

    /**
     * Find the index of of an object is in given array, starting from given inclusive index.
     * @param ts  Array to be searched in.
     * @param t  Object to be searched.
     * @param start  The index from where the search must start.
     * @return Index of the given object in the array if it is there, else -1.
     */
    public static <T> int indexOf(final T[] ts, final T t, int start){
        for(int i = start; i < ts.length; ++i)
            if(ObjectUtils.equals(ts[i], t))
                return i;
        return -1;
    }

    /**
     * Find the index of of an object is in given array, starting from 0;
     * @param ts  Array to be searched in.
     * @param t  Object to be searched.
     * @return  indexOf(ts, t, 0)
     */
    public static <T> int indexOf(final T[] ts, final T t){
        return indexOf(ts, t, 0);
    }

    /**
     * Detect if the given object is in the given array.
     * @param ts  Array to be searched in.
     * @param t  Object to be searched.
     * @return  If indexOf(ts, t) is greater than -1.
     */
    public static <T> boolean in(final T[] ts, final T t){
        return indexOf(ts, t) > -1 ;
    }

}

আপনি উপরের কোডটিতে দেখতে পাচ্ছেন যে অন্যান্য ইউটিলিটি পদ্ধতি রয়েছে ObjectUtils.equals()এবং ArrayUtils.indexOf()অন্যান্য স্থানগুলিতেও এটি ব্যবহৃত হয়েছিল।


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

3

এটা যাচাই কর

String[] VALUES = new String[] {"AB","BC","CD","AE"};
String s;

for(int i=0; i< VALUES.length ; i++)
{
    if ( VALUES[i].equals(s) )
    { 
        // do your stuff
    } 
    else{    
        //do your stuff
    }
}

1
এটি কাজ করে না - এটি মেলে না এমন প্রতিটি আইটেমের elseজন্য প্রবেশ করবে (সুতরাং আপনি যদি সেই অ্যারেতে "এবি" খুঁজছেন তবে এটি 3 বার চলে যাবে, যেহেতু 3 টি মান "AB" নয় ")।
বার্নহার্ড বার্কার

3

অ্যারে.এএসলিস্ট () -> তারপরে কন্টেন্টগুলি () পদ্ধতিতে কল করা সর্বদা কার্যকর হবে তবে অনুসন্ধানের অ্যালগরিদম আরও ভাল কারণ আপনাকে অ্যারের চারপাশে লাইটওয়েট তালিকার মোড়ক তৈরি করতে হবে না, যা অ্যারেএস.এললিস্ট () যা করে ।

public boolean findString(String[] strings, String desired){
   for (String str : strings){
       if (desired.equals(str)) {
           return true;
       }
   }
   return false; //if we get here… there is no desired String, return false.
}

Arrays.asListও (এন) নয়। এটি কেবল একটি হালকা ওজনের র‍্যাপার। বাস্তবায়নটি দেখুন।
প্যাট্রিক পার্কার


2

Array.BinarySearch(array,obj)অ্যারেতে প্রদত্ত বস্তুটি অনুসন্ধানের জন্য ব্যবহার করুন ।

উদাহরণ:

if (Array.BinarySearch(str, i) > -1)`  true --exists

মিথ্যা - নেই


4
Array.BinarySearchএবং Array.FindIndex.NET পদ্ধতি এবং জাভাতে নেই।
ataylor

@ এ্যাটেলর জাভাতে অ্যারে.বাইনারিস অনুসন্ধান রয়েছে। কিন্তু আপনি ঠিক, কোন Arrays.findIndex
mente

এটি লক্ষ করা উচিত:The array must be sorted prior to making this call. If it is not sorted, the results are undefined.
ডোরিয়ান গ্রে

1

প্রথমদিকে মিথ্যাতে সেট করা একটি বুলিয়ান তৈরি করুন। অ্যারের প্রতিটি মান যাচাই করতে একটি লুপ চালান এবং আপনি যে মানটির বিরুদ্ধে যাচ্ছেন তার সাথে তুলনা করুন। আপনি যদি কোনও ম্যাচ পান তবে বুলেয়ানকে সত্যে সেট করুন এবং লুপিং বন্ধ করুন। তারপরে জোর দিয়ে বলুন যে বুলিয়ান সত্য।


1

জাভা 8 প্রিকেট পরীক্ষা পদ্ধতি ব্যবহার করে দেখুন

এটির একটি পূর্ণ উদাহরণ এখানে।

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
public class Test {
 public static final List<String> VALUES = Arrays.asList("AA", "AB", "BC", "CD", "AE");

 public static void main(String args[]) {
  Predicate<String> containsLetterA = VALUES -> VALUES.contains("AB");
  for (String i : VALUES) {

   System.out.println(containsLetterA.test(i));
  } 
 }
}

http://mytechnologythought.blogspot.com/2019/10/java-8-predicate-test-method-example.html

https://github.com/VipulGulhane1/java8/blob/master/Test.java


0

একটি এর ব্যবহার এ এর Spliterator অপ্রয়োজনীয় প্রজন্মকে বাধা দেয় List

boolean found = false;  // class variable

String search = "AB";
Spliterator<String> spl = Arrays.spliterator( VALUES, 0, VALUES.length );
while( (! found) && spl.tryAdvance(o -> found = o.equals( search )) );

found == truesearchঅ্যারে অন্তর্ভুক্ত থাকলে


এটি আদিমদের অ্যারেগুলির জন্য কাজ করে

public static final int[] VALUES = new int[] {1, 2, 3, 4};
boolean found = false;  // class variable

int search = 2;
Spliterator<Integer> spl = Arrays.spliterator( VALUES, 0, VALUES.length );

0

যেহেতু আমি নিম্ন স্তরের জাভা নিয়ে আদিম ধরণের বাইট এবং বাইট ব্যবহার করে কাজ করছি [], এখন অবধি আমি পেয়েছি সেরাটি হচ্ছে বাইটস-জাভা থেকে https://github.com/patrickfav/bytes-java কাজের সূক্ষ্ম অংশ বলে মনে হচ্ছে


-2

আপনি এটি দুটি পদ্ধতি দ্বারা পরীক্ষা করতে পারেন

ক) অ্যারেটিকে স্ট্রিংয়ে রূপান্তরিত করে এবং তারপরে .contains পদ্ধতি দ্বারা প্রয়োজনীয় স্ট্রিংটি পরীক্ষা করুন

 String a=Arrays.toString(VALUES);
    System.out.println(a.contains("AB"));
    System.out.println(a.contains("BC"));
    System.out.println(a.contains("CD"));
    System.out.println(a.contains("AE"));

খ) এটি একটি আরও কার্যকর পদ্ধতি

 Scanner s=new Scanner(System.in);


   String u=s.next();
   boolean d=true;
    for(int i=0;i<VAL.length;i++)
    {
        if(VAL[i].equals(u)==d)
            System.out.println(VAL[i] +" "+u+VAL[i].equals(u));  

    }

1
স্ট্রিং রূপান্তরটি অযৌক্তিকভাবে অক্ষম এবং সমাধানটি ভুল, যেমন (",") রয়েছে সত্য হিসাবে ফিরে আসবে।
অ্যাটুয়াস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.