জাভা: অ্যারেলিস্ট - কোনও সূচক বিদ্যমান আছে কিনা তা আমি কীভাবে পরীক্ষা করতে পারি?


111

আমি ব্যবহার করছি ArrayList<String>এবং আমি নির্দিষ্ট সূচকগুলিতে ডেটা যুক্ত করি, নির্দিষ্ট সূচকের উপস্থিতি আছে কিনা তা আমি কীভাবে পরীক্ষা করতে পারি?

আমার কি সহজভাবে get()এবং মানটি পরীক্ষা করা উচিত? বা আমার কি ব্যতিক্রম অপেক্ষা করা উচিত? অন্য উপায় আছে?

হালনাগাদ

আপনার উত্তরের জন্য আপনাকে ধন্যবাদ, তবে যেহেতু আমি কেবল নির্দিষ্ট সূচকগুলিতে কেবল স্টাফ যুক্ত করছি, তালিকার দৈর্ঘ্য আমাকে উপলভ্য করবে না যা উপলভ্য।


2
আপনার প্রয়োজনের তুলনায় সেটটি সম্ভবত এটি আরও উপযুক্ত কিনা দেখুন?
পল হিলান

3
তারপরে আপনাকে যা করতে হবে get()এবং পরীক্ষা করতে হবে null- যদিও ব্যতিক্রমগুলির উপর নির্ভর করবেন না। একটি ব্যবহার করার কথা বিবেচনা HashTableপরিবর্তে java.sun.com/j2se/1.4.2/docs/api/java/util/Hashtable.html
Amarghosh

অসাধারণ!! আমি হ্যাশটেবল ধন্যবাদ ব্যবহার করব
ufk

উত্তর:


158

পদ্ধতি arrayList.size() ফেরৎ তালিকায় আইটেম সংখ্যা - তাই যদি সূচক চেয়ে মহান বা সমান size(), এটা কোন অস্তিত্ব নেই।

if(index >= myList.size()){
  //index not exists
}else{
 // index exists
}

10
এটি "বৃহত্তর বা সমান" হওয়া উচিত size()কারণ এটি একটি শূন্য-ভিত্তিক সূচক।
ম্যাকডোয়েল

1
আরও উল্লেখ করার মতো যে এই পারমাণবিকটি তৈরি করার জন্য আপনার তালিকাটি লক করা অবস্থায় সম্ভবত আকার () চেক এবং সংশ্লিষ্ট শর্তসাপেক্ষ সূচী ভিত্তিক লুক আপ করা উচিত।
অ্যাডামস্কি

3
দয়া করে মনে রাখবেন যে আমি এই উত্তরটি সঠিকভাবে চিহ্নিত করেছি কারণ মালিক (আমারঘোষ) আমার প্রশ্নের মন্তব্যে আমার প্রশ্নের উত্তর দিয়েছেন। হ্যাশ টেবিল আমার প্রয়োজনগুলি আরও ভালভাবে স্যুট করবে।
ufk

আপনি যদি আইটেমটির আইডি সহ অ্যারেলিস্টে আইটেম সেট করছেন? প্রাক্তন। mylist.set (1, আইটেম 1); mylist.set (3, আইটেম 3); // স্কিপিং 2 আমার ধারণা হ্যাশম্যাপ সেই দৃশ্যের জন্য আরও উপযুক্ত?
ইয়াহমান

এটি আমাকে পুরোপুরি সন্তুষ্ট করে না .. যদি সূচি ইতিমধ্যে উপস্থিত থাকে তবে আমি তালিকায় কিছু করতে চাই তবে অন্যথায় এটি প্রস্তুত করতে .. একটি নতুন তালিকার সাথে আমি শুরু করতে যাচ্ছি index = 0এবং list.size() == 0আমারও। সুতরাং আমি প্রথমবার যাচাই করব এটি সত্য হবে এবং আমি স্টাফগুলি করার জন্য তালিকাটি প্রস্তুত করব। তবে পরের বার সেই সূচীতে, আমার সূচকটি এখনও থাকবে index = 0এবং এখন আমি উপাদানটি তালিকায় আবার শুরু করছি যখন আমার স্টাফ করার কথা ছিল। 1 ম চিন্তা &&দ্বিতীয় অবস্থার মতো list.get(index) == nullতবে এটি কাজ করছে না কেন এই জাতীয় প্রশ্ন রয়েছে
রবার্তো টমস

69

আপনার তালিকার আকার ব্যবহার করার বিষয়ে আপনি এক ডজন পরামর্শ পেয়েছেন যা লিনিয়ার এন্ট্রি সহ তালিকার জন্য কাজ করে, আপনার প্রশ্নটি কেউ পড়তে পারে বলে মনে হয় না।

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

ব্যবহার করেন (list.get (INDEX) == নাল) , হয় কাজ করবে না পান () পরিবর্তে নাল ফিরে একজন ব্যতিক্রম ছোঁড়ার।

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

try {
    list.get( index );
} catch ( IndexOutOfBoundsException e ) {
    list.add( index, new Object() );
}

সূচকের অস্তিত্ব না থাকলে এখানে একটি নতুন এন্ট্রি যুক্ত করা হয়। আপনি এটি অন্যরকম কিছু করতে পরিবর্তন করতে পারেন।


2
আপনাকে ধন্যবাদ, অ্যারে সূচকগুলি বিদ্যমান কিনা ইউনিট পরীক্ষার জন্য এই কৌশলটির প্রয়োজন।
নুমেনন

11
try/catchএই ধরণের কাজের জন্য এড়াতে ভুলবেন না , এটি আপনার প্রোগ্রামটিকে 50% বা আরও বেশি করে ধীরে ধীরে কমিয়ে দেবে .. ত্রুটি পরীক্ষা করা আপনার বিদ্যমান কোডটিকে ধীর করার জন্য একটি স্ট্র্যাপের মতো যুক্ত করে রাখে .. সমালোচনামূলক ক্ষেত্রে এড়াতে আরও ভাল। জন্য চেক করা হচ্ছে lengthএই ক্ষেত্রে, ভাল জিনিস আপনি কি করতে পারেন, যেহেতু indexসবসময় কম তারপর হবে length, পুরাতন indexএর স্থানান্তরিত হবে এবং নতুন হয়ে index's যদি আপনি removeতাদের যাতে কেন জন্য নিয়ম পরীক্ষণ lengthসবসময় কাজ করবে।
এসএসপোক

1
@ এসএসপি ... আমি সম্মত হওয়ার পরেও চেষ্টা / ধরা 'উত্তম' উত্তর থেকে দূরে; তালিকাটি বিচ্ছিন্ন হয়ে গেলে এটি সমস্যার সমাধান করবে। আমি অ্যারে ব্যবহার করার পরামর্শটি পছন্দ করি: অবজেক্ট [] অ্যারি; নীচে বা একটি হ্যাশ
হবে

12

এটি আপনার প্রয়োজন ...

public boolean indexExists(final List list, final int index) {
    return index >= 0 && index < list.size();
}

সরল পুরানো অ্যারে ব্যবহার করবেন না কেন? একটি তালিকার সূচী অ্যাক্সেস আমার মনে হয় এমন একটি কোড গন্ধ।


3
সবসময় নয়, যেহেতু তিনি সময়ের সাথে সাথে অ্যারেলিস্ট বাড়তে চান এবং কোনও অ্যারে এটি করতে পারে না।
কোयोোট 21

7

সাধারণত আমি কেবলমাত্র সূচি অ্যারের আকারের চেয়ে কম কিনা তা যাচাই করি

if (index < list.size()) {
    ...
}

আপনি যদি সূচকটিকে নেতিবাচক মান বলেও উদ্বিগ্ন হন তবে নিম্নলিখিতগুলি ব্যবহার করুন

if (index >= 0 && index < list.size()) {
    ...
}

1
কয়েক বছর আগে গৃহীত উত্তরের চেয়ে কীভাবে এটি কোনও মূল্য সরবরাহ করে ?
বাসিল বাউরক

2
আমি আপনার দৃষ্টিতে ধারণা করি এটি কোনও মূল্য দেয় না, তবে আমি গ্রহণযোগ্য উত্তর সম্পর্কে রবার্তো টমসের একটি মন্তব্য দেখেছি, ধরে নিয়েছি যে তিনি গ্রহণযোগ্য উত্তরটি বেশ বুঝতে পারেন নি। এটি পরীক্ষা করে দেখুন "একটি নতুন তালিকার সাথে আমি সূচক = 0 এবং আমার তালিকাতে শুরু করতে চলেছি ize আকার () == 0ও so তাই প্রথমবার যাচাই করলে সত্য হবে" আমি সাহায্যের জন্য আলাদা উত্তর পোস্ট করার সিদ্ধান্ত নিয়েছি ভবিষ্যতের যে কোনও বিভ্রান্তি।
আমিরআর

6

আপনার আপডেট সম্পর্কিত (যা সম্ভবত অন্য একটি প্রশ্ন হওয়া উচিত)। আপনার পরিবর্তে একটি অ্যারেলিস্টের এই বিষয়গুলির একটি অ্যারে ব্যবহার করা উচিত, যাতে আপনি কেবল শূন্যের জন্য মানটি পরীক্ষা করতে পারেন:

Object[] array = new Object[MAX_ENTRIES];
..
if ( array[ 8 ] == null ) {
   // not available
}
else {
   // do something
}

ভাল অভ্যাস

আপনার অ্যারেতে যদি শত শত এন্ট্রি না থাকে তবে আপনার ম্যাজিক সংখ্যা 3,8 ইত্যাদি থেকে মুক্তি পাওয়ার জন্য এটি একটি শ্রেণি হিসাবে সংগঠিত করার কথা বিবেচনা করা উচিত etc.

ব্যতিক্রম ব্যবহার করে নিয়ন্ত্রণ প্রবাহ খারাপ অভ্যাস।


1
অ্যারে [8] উপস্থিত না থাকলে, আপনি অ্যারেআইন্ডেক্সআউটআউটবাউন্ডএক্সসেপশনটির মুখোমুখি হবেন।
নীতেশ কুমার আনন্দ

4

যেহেতু java-9একটি সূচক অ্যারের সাথে সম্পর্কিত কিনা তা পরীক্ষা করার একটি মানক উপায় রয়েছে - অবজেক্টস # চেক ইন্ডেক্স () :

List<Integer> ints = List.of(1,2,3);
System.out.println(Objects.checkIndex(1,ints.size())); // 1
System.out.println(Objects.checkIndex(10,ints.size())); //IndexOutOfBoundsException

of()পদ্ধতিটি জাভা 9- এ শ্রেণীর তালিকায় যুক্ত করা হয়েছে : docs.oracle.com/javase/9/docs/api/java/util/List.html#of--
ওরিশি

3

আপনি পদ্ধতিটি ArrayListব্যবহার করে size()কোনওটির আকার পরীক্ষা করতে পারেন । এটি সর্বোচ্চ সূচকটি +1 প্রদান করবে


2

এটি করার একটি সহজ উপায়:

try {
  list.get( index ); 
} 
catch ( IndexOutOfBoundsException e ) {
  if(list.isEmpty() || index >= list.size()){
    // Adding new item to list.
  }
}

1

সূচকের অস্তিত্ব আছে কি নেই তার জন্য দ্রুত এবং নোংরা পরীক্ষা। আপনার প্রয়োগে তালিকার প্রতিস্থাপন তালিকার সাথে আপনি পরীক্ষা করছেন।

public boolean hasIndex(int index){
    if(index < list.size())
        return true;
    return false;
}

বা 2 মাত্রিক অ্যারেলিস্টের জন্য ...

public boolean hasRow(int row){
    if(row < _matrix.size())
        return true;
    return false;
}

1
তালিকাগুলিতে .lengthএটি নেই list.size()তবে এটি কোনও বড় বিষয় নয় আমি সর্বদা হ্যাঁ এইভাবেই আমাকে গাইড করতে সংকলকটির উপর নির্ভর করি ha আপনি সম্ভবত আদিম অ্যারেগুলি সম্পর্কে
ভাবছিলেন

1
এটি ধরার জন্য ধন্যবাদ ধারক কার্ডিনালিটি ভুলে যাওয়া সহজ হতে পারে।
t3dodson

0

যদি আপনার সূচকটি আপনার তালিকার আকারের চেয়ে কম হয় তবে এটি সম্ভবত nullমান সহ বিদ্যমান । যদি সূচকটি বড় হয় তবে আপনি ensureCapacity() সেই সূচকটি ব্যবহার করতে সক্ষম হতে কল করতে পারেন।

আপনার সূচকের কোনও মান আছে কিনা তা আপনি যদি পরীক্ষা করতে চান তবে nullকল করুনget()


1
ক্যাপাসিটি (ইনট) নিশ্চিতকরণে কল করার ফলে তালিকার আকার বাড়বে না, কেবলমাত্র ক্ষমতা; অর্থাত্ "সম্ভাব্য আকার" এর বাইরে সীমার বাইরে লুক-আপগুলি এখনও ব্যর্থ হবে।
অ্যাডামস্কি

এছাড়াও, কেন কল্পনাশক্তি (ইনট) মোটেও? এটি একটি অবিশ্বাস্যরূপে ব্যয়বহুল অপারেশন হতে পারে যদি উদাহরণস্বরূপ তালিকার বর্তমান আকার 5 হয় এবং আপনি আইটেমটির মান নির্ধারণ করতে চান #: 100,000,000।
অ্যাডামস্কি

আমি বোঝাতে চেয়েছিলাম যে আকারের চেয়ে কম সূচকগুলি সর্বদা বিদ্যমান থাকে, যা> = আকার () হয় না এবং তালিকাটি যথেষ্ট বড় না হওয়া অবধি কেউ এগুলি (== কল সেট ()) ব্যবহার করতে পারে না। সুনিশ্চিতকরণের জন্য কলিং ক্যাপাসিটি প্রকৃতপক্ষে যথেষ্ট নয়, উপাদান যুক্ত করে আকার পরিবর্তন করা দরকার to
দিমিত্রি

ক্যাপাসিটি (ইনট) আসলে কী করে তা সম্পর্কে ভুল ব্যাখ্যা। এটি অ্যারেলিস্ট আকারের সাথে কিছুই করে না।
মোহসেন

0

আপনি অ্যারের আকারের জন্য পরীক্ষা করতে পারেন।

package sojava;
import java.util.ArrayList;

public class Main {
    public static Object get(ArrayList list, int index) {
        if (list.size() > index) { return list.get(index); }
        return null;
    }

    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add(""); list.add(""); list.add("");        
        System.out.println(get(list, 4));
        // prints 'null'
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.