জাভার অ্যারে সূচি কোথায়?


198

আমি অবশ্যই খুব স্পষ্ট কিছু মিস করছি, তবে আমি সমস্ত অনুসন্ধান করেছি এবং এই পদ্ধতিটি খুঁজে পাচ্ছি না।

উত্তর:


234

Arraysইউটিলিটি ক্লাস ব্যবহার করে এটি সম্পাদন করার কয়েকটি উপায় রয়েছে ।

যদি অ্যারে বাছাই না করা হয় এবং আদিমদের অ্যারে না হয় :

java.util.Arrays.asList(theArray).indexOf(o)

অ্যারেটি যদি প্রাথমিক হয় এবং বাছাই না হয় তবে কেরেম বায়ডোয়ানস , অ্যান্ড্রু ম্যাককিনলে বা মিশাক্সের মতো উত্তরগুলির মধ্যে একটির দেওয়া সমাধান ব্যবহার করা উচিত । উপরের কোডটি theArrayআদিম হলেও সংকলন করবে (সম্ভবত একটি সতর্কতা নির্গমন করছে) তবে তবুও আপনি সম্পূর্ণ ভুল ফলাফল পাবেন।

অ্যারে বাছাই করা থাকলে, আপনি সম্পাদনার জন্য বাইনারি অনুসন্ধান ব্যবহার করতে পারেন:

java.util.Arrays.binarySearch(theArray, o)

3
আমি নিশ্চিত এই উত্তর জাভা 1.6 জন্য অন্তত ভুল: download.oracle.com/javase/6/docs/api/java/util/... asList না একটি তালিকা যুক্তি নিজেই মধ্যে আর্গুমেন্টের তালিকায় রূপান্তরিত করে।
আলেকজান্দ্রু

11
@ অ্যালেক্সান্দ্রু এলিপিসিস হ্যান্ডলিং সিনট্যাকটিক চিনি। যদি আপনার কাছে কোনও যুক্তি টাইপ করা থাকে তবে আর্গুমেন্টের T...আসল রান-টাইম টাইপ হয় T[]এবং শূন্য বা ততোধিক প্রকারের প্যারামিটারগুলিতে পাস Tকরার ফলে সেগুলি একটি নতুন নির্মিত অ্যারেতে আবৃত হয়ে উত্তীর্ণ হয়। যদি পাস করা প্যারামিটারটি ইতিমধ্যে টাইপের হয় T[]তবে সিনট্যাকটিক চিনিকে বাইপাস করা হবে।
জেফ্রি হ্যান্টিন

7
আমি আপনার পয়েন্ট দেখুন. যদিও সমাধান ( .indexOf) আদিমদের পক্ষে বৈধ নয়।
আলেকজান্দ্রু

53
যেহেতু কেউ উল্লেখ করেনি: অ্যারে.এএসলিস্ট ইতিমধ্যে বিদ্যমান অ্যারেটিকে ব্যাকিং হিসাবে ব্যবহার করে। (অর্থাত্ একটি অনুলিপি তৈরি হওয়ার বিষয়ে কোনও উদ্বেগ নেই))
জোশুয়া গোল্ডবার্গ

4
@ নোটিনলিস্ট জাভা ছেলেরাও এটি ভেবেছিল। Arrays.toList(list).sublist(from,to).indexOf(o)সীমার মধ্যে একটি উপাদান অনুসন্ধান করতে ব্যবহার করুন [from, to)
মারিও কার্নেরিও

62

অ্যারের কোনও indexOf()পদ্ধতি নেই।

সম্ভবত এই অ্যাপাচি কমন্স ল্যাং ArrayUtilsপদ্ধতিটি আপনি যা খুঁজছেন তা

import org.apache.commons.lang3.ArrayUtils;

String[] colours = { "Red", "Orange", "Yellow", "Green" };

int indexOfYellow = ArrayUtils.indexOf(colours, "Yellow");

গ্রহনটি এই আমদানি গ্রন্থাগারটি খুঁজে পাবে না।
ওমোর

21

আদিমদের জন্য , আপনি যদি বক্সিং এড়াতে চান তবে পেয়ারাতে আদিম অ্যারেগুলির জন্য সহায়ক রয়েছে যেমন Ints.indexOf (int [] অ্যারে, আন্ত লক্ষ্য)


অন্যান্য সমাধানগুলি সমস্ত নতুন স্ট্রিং বা তালিকাগুলি তৈরি করে বা কেবল একক উপাদানগুলিকে পরিচালনা করে। পেয়ারা চরস.আইডিএক্সএফ আপনাকে একটি অ্যারেতে একটি অ্যারের সূচক পেতে দেয়। এটিই সঠিক সমাধান।
হ্যাপিইঞ্জিনিয়ার

18

কেউ নেই. হয় একটি java.util.List* ব্যবহার করুন , বা আপনি নিজের লিখতে পারেন indexOf():

public static <T> int indexOf(T needle, T[] haystack)
{
    for (int i=0; i<haystack.length; i++)
    {
        if (haystack[i] != null && haystack[i].equals(needle)
            || needle == null && haystack[i] == null) return i;
    }

    return -1;
}

* আপনি ব্যবহার করে আপনার অ্যারে থেকে একটি তৈরি করতে পারেন Arrays#asList()


2
ব্যবহার Tবিভ্রান্তিকর। এটি কোনও ধরণের সুরক্ষা সরবরাহ করে না, ভুল করা সহজ এটি নিরাপদ প্রকারের ... আরও ভাল ব্যবহারের উদ্দেশ্য
ভেঙ্কটা রাজু

4
@ ভেনকাটারাজু, এখানে টি ব্যবহার করে উভয় পদ্ধতি পরামিতিকে একই ধরণের হতে বাধ্য করে forces এটি দরকারী।
গোনাদিয়ান

5
পছন্দ করুন এই প্রনয়ন দুজনেই ঠিক সূক্ষ্ম: indexOf("str", new Object[] {});,indexOf(new Object(), new String[] {});
Venkata রাজু

1
@ ভেনকাটারাজু হ্যাঁ সত্যিই। আপনার উদাহরণটি কোনও প্রমাণ দেয় না যেহেতু স্ট্রিং একটি অবজেক্ট ... সুতরাং স্পষ্টত কোনও অবজেক্ট অ্যারেতে একটি স্ট্রিং থাকতে পারে যা আপনি সূচীটি পেতে চাইতে পারেন।

1
@ ghert85 আরেকটি উদাহরণ: indexOf("str", new Date[] {}),indexOf(new Date(), new String[] {})
Venkata রাজু

15

C # ভিন্ন আপনি যেখানে Array.IndexOf পদ্ধতি, এবং JavaScript যেখানে আপনি indexOf মধ্যে পদ্ধতি, জাভার এপিআই ( Arrayএবং Arraysবিশেষ করে ক্লাস) যেমন কোন পদ্ধতি আছে।

এই পদ্ধতিটি সূচকফ (তার পরিপূরক লাস্ট ইন্ডেক্সঅফের সাথে একসাথে) java.util.List ইন্টারফেসে সংজ্ঞায়িত হয়েছে । নোট করুন যে সূচিপত্রফ এবং সর্বশেষআইডেক্সফ ওভারলোড করা হয়নি এবং কেবলমাত্র প্যারামিটার হিসাবে একটি অবজেক্ট গ্রহণ করুন।

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

  1. অ্যারেটিকে প্রাকৃতিক ক্রমে বা তুলনামূলকভাবে সাজানো হবে যা আপনি একটি যুক্তি হিসাবে সরবরাহ করেছেন বা খুব কমপক্ষে সমস্ত উপাদান যা "এর চেয়ে কম" থাকে অ্যারেতে থাকা উপাদানগুলির আগে উপস্থিত হওয়া উচিত এবং সমস্ত উপাদান অ্যারের মধ্যে সেই এলিমেন্টের পরে কী অবশ্যই "এর চেয়ে বড়" হবে;

  2. আপনি যে পরীক্ষাটি সাধারণত সূচকগুলিতে করেন তা নির্ধারণ করতে কোনও কী কী অ্যারেতে রয়েছে তা নির্ধারণ করুন (ফেরতের মান -1 নয় কিনা তা যাচাই করুন) বাইনারি অনুসন্ধানের সাথে রাখে না। আপনাকে যাচাই করতে হবে যে রিটার্নের মান শূন্যের চেয়ে কম নয়, যেহেতু প্রত্যাবর্তিত মানটি কীটি উপস্থিত নেই তা নির্দেশ করবে তবে যে সূচকটি এটি উপস্থিত থাকলে তা প্রত্যাশা করা হত;

  3. যদি আপনার অ্যারেতে একাধিক উপাদান থাকে যা চাবির সমান হয়, আপনি বাইনারি অনুসন্ধান থেকে যা পান তা অপরিজ্ঞাত; এটি সূচক থেকে পৃথক যা প্রথম উপস্থিতি এবং সর্বশেষ ঘটনাটি ফিরে আসবে এমন সর্বশেষতম ইনডেক্সও অফ করবে will

  4. এটিতে প্রথমে সমস্ত ফলস এবং তারপরে সমস্ত ট্রু রয়েছে তবে বুলিয়ানগুলির একটি অ্যারে বাছাই করা হতে পারে but বাইনারি অনুসন্ধান পদ্ধতির কোনও ওভাররাইড নেই যা বুলিয়ানগুলির একটি অ্যারে গ্রহণ করে এবং আপনাকে ও (লগ এন) পারফরম্যান্স করতে চাইলে সেখানে কোনও চালাক কিছু করতে হবে, উদাহরণস্বরূপ একটি অ্যারে ব্যবহার করে উদাহরণস্বরূপ বুলিয়ানস এবং ধ্রুবকগুলি বুলিয়ান F ফ্যালস এবং বুলিয়ান T ট্রু

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

আপনার অ্যারের সাজানো না হয় তাহলে এবং অ্যারে ধরণ হয় আদিম , আপনি জাভা এপিআই সঙ্গে ভাগ্য সীমার বাইরে। লুপের জন্য আপনার নিজের বা আপনার নিজস্ব স্ট্যাটিক ইউটিলিটি পদ্ধতির জন্য লিখুন, এতে অবশ্যই ASList পদ্ধতির উপর পারফরম্যান্স সুবিধাগুলি থাকবে যার মধ্যে কোনও অবজেক্ট ইনস্ট্যান্টিয়েশনের কিছু ওভারহেড জড়িত। আপনি যদি উদ্বিগ্ন হন যে লুপের জন্য একটি ব্রুট ফোর্স যে অ্যারের সমস্ত উপাদানগুলির উপরে পুনরাবৃত্তি হয় তা মার্জিত সমাধান নয়, আপনি যখন ইন্ডেক্স অফে কল করবেন তখন জাভা এপিআই ঠিক তা করছে তা গ্রহণ করুন। আপনি এই জাতীয় কিছু তৈরি করতে পারেন:

public static int indexOfIntArray(int[] array, int key) {
    int returnvalue = -1;
    for (int i = 0; i < array.length; ++i) {
        if (key == array[i]) {
            returnvalue = i;
            break;
        }
    }
    return returnvalue;
}

আপনি যদি এখানে নিজের পদ্ধতি লেখার বিষয়টি এড়াতে চান তবে পেয়ারা জাতীয় বিকাশের কাঠামো থেকে এটি ব্যবহার করার বিষয়টি বিবেচনা করুন। তোমাদের মধ্যে একটি বাস্তবায়ন আছে জানতে পারেন indexOf মধ্যে এবং lastIndexOf


11

জাভা ArrayListএকটি indexOfপদ্ধতি আছে। জাভা অ্যারেতে এ জাতীয় কোনও পদ্ধতি নেই।


26
শুধু নয় ArrayList- প্রতিটি জাভাতে Listরয়েছে indexOf()
ম্যাট বল

6

আমি নিজের জন্য কোডিং ব্যতীত অ্যারেগুলিতে "ইনডেক্সফ" এর কথা মনে করি না ... যদিও আপনার অ্যারেতে আদিম ধরণের রয়েছে তবে আপনি সম্ভবত অনেকগুলি java.util.Arrays#binarySearch(...)পদ্ধতির একটি ব্যবহার করতে পারেন ( অ্যারে জাভাদোক দেখুন )


5

তালিকার ইন্টারফেসের একটি সূচিপত্র () পদ্ধতি রয়েছে এবং আপনি অ্যারের অ্যাসলিস্ট () পদ্ধতির সাহায্যে আপনার অ্যারে থেকে একটি তালিকা পেতে পারেন। তা ছাড়া আরে নিজেই এ জাতীয় কোনও পদ্ধতি নেই। বাছাই করা অ্যারেগুলির জন্য এটিতে বাইনারি অনুসন্ধান () পদ্ধতি রয়েছে।


4

অ্যারে তাদের নিজস্ব পদ্ধতি নেই। একটি তালিকা অবশ্য করে: সূচিপত্র


2
শুধু নয় ArrayList- প্রতিটি জাভাতে Listরয়েছে indexOf()
ম্যাট বল

হ্যাঁ, আমি কেবল অ্যারেলিস্ট নির্দিষ্ট করেছি কারণ ওপি যা খুঁজছিল তার সবচেয়ে কাছের জিনিস এটি হতে পারে :)
ইগোর


2

জাভা অ্যারেগুলিতে কোনও সরাসরি সূচকঅফ ফাংশন নেই।


0

জেফ্রি হ্যান্টিনের উত্তরটি ভাল তবে এর কিছু বাধা আছে, যদি এটি এটি এই কাজ করে বা অন্যথায় ...

আপনি নিজের এক্সটেনশন পদ্ধতিটি লিখতে পারেন এবং এটি সর্বদা আপনার পছন্দ মতো কাজ করে।

Lists.indexOf(array, x -> item == x); // compare in the way you want

এবং এখানে আপনার এক্সটেনশন

public final class Lists {
    private Lists() {
    }

    public static <T> int indexOf(T[] array, Predicate<T> predicate) {
        for (int i = 0; i < array.length; i++) {
            if (predicate.test(array[i])) return i;
        }
        return -1;
    }

    public static <T> int indexOf(List<T> list, Predicate<T> predicate) {
        for (int i = 0; i < list.size(); i++) {
            if (predicate.test(list.get(i))) return i;
        }
        return -1;
    }

    public interface Predicate<T> {
        boolean test(T t);
    }
}

-4
int findIndex(int myElement, int[] someArray){
 int index = 0;
 for(int n: someArray){
   if(myElement == n) return index;
   else index++;
 }
}

দ্রষ্টব্য: আপনি টাইপ ইন্টির অ্যারেগুলির জন্য এই পদ্ধতিটি ব্যবহার করতে পারেন, আপনি ছোট ছোট পরিবর্তন সহ অন্যান্য ধরণের ক্ষেত্রেও এই অ্যালগরিদমটি ব্যবহার করতে পারেন


1
-1: প্রথমে এটি মূল অ্যারেটিকে বাছাই করতে রূপান্তর করে যা আমরা চাই না। দ্বিতীয় এটি উত্তরটি বাছাই করা অ্যারে দেয়, মূল অ্যারেটি নয় যা সম্ভবত আমরা যা চাই (আমরা যদি উত্তর আর্টটি সাজানো অ্যারে চাইতাম তবে এটি ইতিমধ্যে বাছাই করা হত)। তৃতীয় যেহেতু বাছাই করা হয় O (n লগ এন) এটি কেবল রেখাযুক্ত অ্যারের মধ্য দিয়ে যাওয়ার চেয়ে ধীর। সুতরাং এই উত্তরটি ভুল এবং অদক্ষ উভয়ই।
জেমি

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