জাভা, সরলীকৃত চেক ইনট অ্যারেটিতে অন্তর্ভুক্ত রয়েছে কিনা check


96

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

বর্তমান:

public boolean contains(final int[] array, final int key) {
    for (final int i : array) {
        if (i == key) {
            return true;
        }
    }
    return false;
}

এটি চেষ্টাও করেছেন, যদিও এটি সর্বদা কোনও কারণে মিথ্যা দেয় returns

public boolean contains(final int[] array, final int key) {
    return Arrays.asList(array).contains(key);
}

কেউ আমাকে সাহায্য করতে পারে?

ধন্যবাদ.


8
আপনার অ্যারে.এএসলিস্ট (...) কলটি একটি ভার্জ নেয়, এটি হ'ল এটি তালিকায় আপনি যে পরিমাণ আর্গুমেন্ট পাঠাতে পারেন তার স্বেচ্ছাসেবী সংখ্যার মোড়কে দেবে। আপনার ক্ষেত্রে, আপনি একটি একক উপাদানের সাথে অ্যারেগুলির একটি তালিকা পেয়ে যাচ্ছেন এবং এই তালিকায় অবশ্যই অন্তর্ভুক্ত নেই।
সারকান

আপনার মন্তব্য মানে এখন কি?
সারকান

Hashsetভিত্তিক পুনরায় বিচার প্রক্রিয়া উত্তর পরীক্ষা করে দেখুন । এটি সবচেয়ে দ্রুততম উপায়।
অমিত দেশপাণ্ডে

আপনার যুক্তিটি আদিম অ্যারে হওয়ায় আপনার কোডটি খুব পরিষ্কার এবং সোজা ow ArrayListবাস্তবায়ন একই কাজ করছে।
জেনজার

আমি আপনার কোডটি ছোট করব না। (1) অ্যারেলিস্ট আপনার মত একই কাজ করে। (২) - আরও গুরুত্বপূর্ণ বিষয় হ'ল অ্যারে.এএসলিস্ট ব্যবহার করে সংক্ষিপ্ত কোডটি নতুন বস্তু তৈরি করে, যা কিছু পারফরম্যান্স সমালোচনামূলক কোডের মধ্যে সমস্যা হতে পারে। প্রথম কোড স্নিপেট আপনি করতে পারেন সেরা জিনিস।
মার্টিন পডভাল

উত্তর:


41

এখানে জাভা 8 সমাধান রয়েছে

public static boolean contains(final int[] arr, final int key) {
    return Arrays.stream(arr).anyMatch(i -> i == key);
}

64

আপনি কেবল ব্যবহার করতে পারে ArrayUtils.containsথেকে Apache Commons Lang library

public boolean contains(final int[] array, final int key) {     
    return ArrayUtils.contains(array, key);
}

4
যতক্ষণ আপনি অ্যারে ইউটিলস ব্যবহার করছেন ততক্ষণ অ্যারে
ইউটিলস

4
যাই হোক না কেন :)
Reimeus

20
এটি লক্ষণীয় যে লাইব্রেরির ArrayUtils.contains()অংশ Apache Commons Lang। যদিও এটি একটি দুর্দান্ত লিবিব, তবুও অ্যারেতে কোনও উপাদান রয়েছে কিনা তা পরীক্ষা করার জন্য বাহ্যিক নির্ভরতা যুক্ত করা সম্ভবত এখনও ভাল ধারণা নয়: ডি
ক্রিজিসেক

4
অ্যারে ইউটিলস অতীতের জিনিস। জাভা 8+ এবং পেয়ারা বেশ বিস্ময়কর গুডিজ আছে !!
ট্রাই কোর

34

এটা কারণ Arrays.asList(array)ফিরে List<int[]>arrayআর্গুমেন্টকে এমন একটি মান হিসাবে বিবেচনা করা হয় যা আপনি মোড়ানো করতে চান (আপনি ইনটগুলির অ্যারেগুলির তালিকা পান), ভারাক হিসাবে নয়।

নোট যে করে বস্তুর প্রকার (না প্রিমিটিভের) সঙ্গে কাজ:

public boolean contains(final String[] array, final String key) {
    return Arrays.asList(array).contains(key);
}

অথবা এমনকি:

public <T>  boolean contains(final T[] array, final T key) {
    return Arrays.asList(array).contains(key);
}

তবে আপনার থাকতে পারে না List<int>এবং অটোবক্সিং এখানে কাজ করছে না।


4
অটোবক্সিং কেন কাজ করে না, এটি চূড়ান্ত হিসাবে ঘোষিত হওয়ার কারণে?
সুভাষিস

19

পেয়ারা আদিম ধরণের জন্য অতিরিক্ত পদ্ধতি অফার করে। এর মধ্যে একটি পদ্ধতি রয়েছে যা আপনার মতো একই যুক্তি গ্রহণ করে।

public boolean contains(final int[] array, final int key) {
    return Ints.contains(array, key);
}

আপনি সম্ভবত স্থিরভাবে পেয়ারা সংস্করণ আমদানি করতে পারেন।

দেখুন পেয়ারা প্রিমিটিভের ব্যাখ্যা


18

একটি ভিন্ন উপায়:

public boolean contains(final int[] array, final int key) {  
     Arrays.sort(array);  
     return Arrays.binarySearch(array, key) >= 0;  
}  

এটি পাস-ইন অ্যারে সংশোধন করে। আপনার কাছে অ্যারের অনুলিপি করতে হবে এবং মূল অ্যারেতে কাজ করার বিকল্প থাকবে তবে int[] sorted = array.clone();
এটি শর্ট কোডের একটি উদাহরণ মাত্র। রানটাইম O(NlogN)আপনার পথ চলার সময়O(N)


30
আমার মনে হয় যদি কোনও containsপদ্ধতি আমার অ্যারে পরিবর্তন করে তবে আমি অবাক হয়ে যাব।
জং

@ জংলি: এটি আমরা যদি নীটপিক করছিলাম তবে অপ্টেটেড ওপি-র জন্য কেবল উদাহরণ
ক্রেটিলাস

5
বাইনারি সার্চ () এর জাভাদোক থেকে: "কীটি পাওয়া গেলে কেবল ফেরতের মান> = 0 হবে" " সুতরাং অ্যারে.বাইনারিস অনুসন্ধান (অ্যারে, কী)> = 0 ফিরে আসা উচিত!
আইকজা

পরিপূরক: বাইনারি অনুসন্ধান () এর রিটার্ন মান হ'ল (- (সন্নিবেশ বিন্দু) - 1) যদি কীটি না থাকে যা সম্ভবত -1 বাদে অন্য কোনও মান হতে পারে।
আইকজা

এটি -1সত্য হওয়ার ইচ্ছা থাকলে এটি হতে পারে না। "সন্নিবেশ বিন্দুটি সেই বিন্দু হিসাবে সংজ্ঞায়িত করা হয়েছে যেখানে তালিকায় কীটি প্রবেশ করানো হবে: কীটির চেয়ে প্রথম উপাদানটির সূচক বা তালিকা। সাইজ () যদি তালিকার সমস্ত উপাদান নির্দিষ্ট কী থেকে কম থাকে। "। বলা দরকার >= 0
ব্রায়ান


1

1. এক-বন্ধ ব্যবহার

List<T> list=Arrays.asList(...)
list.contains(...)

2. যদি আপনি একাধিকবার ব্যবহার করেন তবে পারফরম্যান্স বিবেচনার জন্য হ্যাশসেট ব্যবহার করুন।

Set <T>set =new HashSet<T>(Arrays.asList(...));
set.contains(...)

1

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

public static void arrayContains(){
    int myArray[]={2,2,5,4,8};

    int length=myArray.length;

    int toFind = 5;
    boolean found = false;

    for(int i = 0; i < length; i++) {
        if(myArray[i]==toFind) {
            found=true;
        }
    }

    System.out.println(myArray.length);
    System.out.println(found); 
}

1

আপনি নিজের আদিম আন্ত অ্যারেটিকে জাভা 8 কোডের নীচে ব্যবহার করে পূর্ণসংখ্যার অ্যারেলিস্টে রূপান্তর করতে পারেন,

List<Integer> arrayElementsList = Arrays.stream(yourArray).boxed().collect(Collectors.toList());

এবং তারপরে contains()তালিকায় কোনও নির্দিষ্ট উপাদান রয়েছে কিনা তা পরীক্ষা করার জন্য পদ্ধতিটি ব্যবহার করুন ,

boolean containsElement = arrayElementsList.contains(key);

0

এটি জাভা 8 এ কাজ করে

public static boolean contains(final int[] array, final int key)
{
return Arrays.stream(array).anyMatch(n->n==key);
}

এটি তাত্ক্ষণিকভাবে প্রথম ম্যাচে ফিরে আসা উচিত, পরিবর্তে এটি ম্যাচটি খুঁজে না পাওয়া সত্ত্বেও এটি অ্যারেতে সমস্ত আইটেম স্ক্যান করবে। (ট্রিলিয়ন আইটেমগুলির একটি অ্যারে বিবেচনা করুন)
ট্রাইকোর

আপনি এই পাবলিক স্ট্যাটিক বুলিয়ান অন্তর্ভুক্ত করার চেষ্টা করছেন (চূড়ান্ত ইন [] অ্যারে, চূড়ান্ত অভ্যন্তরীণ কী) {ফিরে অ্যারেস স্ট্রিম (অ্যারে) .নিম্যাচ (এন-> এন == কী); }
ফরহাদ বাঘিরভ

জাভা 8 স্ট্রিম যেকোন ম্যাচ একটি শর্ট সার্কিট ক্রিয়াকলাপ এবং অ্যারেতে সমস্ত আইটেম স্ক্যান করবে না।
লর্ডপারসলে

@ লর্ড পার্সলে উপরে কোডের লক্ষ্য অ্যারেতে চেক এলিমেন্ট রয়েছে, অ্যারের সমস্ত উপাদান স্ক্যান করে না।
ফরহাদ বাঘিরভ

দুঃখিত, আমি উত্তর সম্পাদিত হয়েছে দেখুন। আমি কেবল এটি পুনরুদ্ধার করছিলাম এটি সঠিক ছিল কারণ এটি যদি একটি অংশের উপায় খুঁজে পায় তবে এটি সমস্ত স্ক্যান করার প্রয়োজন হবে না।
লর্ডপার্সলে

0

আপনি java.util.Arraysক্লাস ব্যবহার করতে পারেন এমন পদ্ধতিগুলির সাহায্যে T[?]কোনও List<T>বস্তুতে অ্যারে রূপান্তর করতে contains:

Arrays.asList(int[] array).contains(int key);

-1

আপনার আর এর অ্যারে কত বড় হবে তার উপর নির্ভর করে আপনি যদি সংগ্রহগুলি ব্যবহার .containsকরেন এবং একবারে অ্যারেতে একটি উপাদানকে পুনরুক্ত করার চেয়ে আপনি আরও ভাল পারফরম্যান্স পাবেন :

import static org.junit.Assert.assertTrue;
import java.util.HashSet;

import org.junit.Before;
import org.junit.Test;

public class IntLookupTest {

int numberOfInts = 500000;
int toFind = 200000;
int[] array;

HashSet<Integer> intSet;

@Before
public void initializeArrayAndSet() {
    array = new int[numberOfInts];
    intSet = new HashSet<Integer>();
    for(int i = 0; i < numberOfInts; i++) {
        array[i] = i;
        intSet.add(i);
    }
}

@Test
public void lookupUsingCollections() {
    assertTrue(intSet.contains(toFind));
}

@Test
public void iterateArray() {
    assertTrue(contains(array, toFind));

}

public boolean contains(final int[] array, final int key) {
    for (final int i : array) {
        if (i == key) {
            return true;
        }
    }
    return false;
}
}

-1

সমাধান # 1

যেহেতু মূল প্রশ্নটি কেবল একটি সরল সমাধান চায় (এবং দ্রুত নয়), তাই এখানে একটি লাইন সমাধান রয়েছে:

public boolean contains(int[] array, int key) {
    return Arrays.toString(array).matches(".*[\\[ ]" + key + "[\\],].*");
}

ব্যাখ্যা:Arrays.toString() রাজ্যের জাভাদোক ফলাফল বর্গাকার বন্ধনীতে আবদ্ধ এবং সংলগ্ন উপাদানগুলি অক্ষর দ্বারা পৃথক করা হয় "," (একটি স্থানের পরে কমা)। সুতরাং আমরা এই উপর নির্ভর করতে পারেন। প্রথমে আমরা arrayএকটি স্ট্রিংয়ে রূপান্তর করি এবং তারপরে আমরা পরীক্ষা করি যে keyএই স্ট্রিংটিতে রয়েছে কিনা check অবশ্যই আমরা "সাব-নাম্বারগুলি" গ্রহণ করতে পারি না (যেমন "1234" "23" রয়েছে), তাই আমাদের এমন নিদর্শনগুলি সন্ধান করতে হবে যেখানে keyখোলার বন্ধনী বা একটি স্থানের আগে রয়েছে এবং তার পরে ক্লোজিং বন্ধনী বা কমা হবে।

দ্রষ্টব্য: ব্যবহৃত regexp প্যাটার্নটিও সঠিকভাবে নেতিবাচক সংখ্যাগুলি পরিচালনা করে (যার স্ট্রিং প্রতিনিধিত্ব একটি বিয়োগ চিহ্ন দিয়ে শুরু হয়)।

সমাধান # 2

এই সমাধানটি ইতিমধ্যে পোস্ট করা হয়েছে তবে এতে ভুল রয়েছে, তাই আমি সঠিক সমাধানটি পোস্ট করছি:

public boolean contains(int[] array, int key) {
    Arrays.sort(array);
    return Arrays.binarySearch(array, key) >= 0;
}

এছাড়াও এই সমাধানটির একটি পার্শ্ব প্রতিক্রিয়া রয়েছে: এটি array(এটির প্রকারের) পরিবর্তন করে ।


স্ট্রিং হ্যান্ডলিগটি সাধারণত ব্যয়বহুল, কেন কেউ ইনটকে স্ট্রিং হিসাবে বিবেচনা করবে?
ভেটালি

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

আমার তখন প্রশ্নটি ভুল বোঝা উচিত ছিল, জিজ্ঞাসা করার জন্য দুঃখিত
ডেনিস ভিটালি

-5

এটি Integer.parseInt()করার চেষ্টা করুন .....

public boolean chkInt(final int[] array){
    int key = false;

    for (Integer i : array){


          try{

                   Integer.parseInt(i);
                   key = true;
                   return key;

             }catch(NumberFormatException ex){

                   key = false;

                   return key;

              }


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