Java のカスタム ArrayList

Java のカスタム ArrayList

先に進む前に、の概念を簡単に修正しましょう。 配列 そして 配列リスト 素早く。 Java では、配列がメモリ アドレス空間に要素を連続的に追加する機能を提供する線形データ構造であるのに対し、ArrayList は Collection フレームワークに属するクラスであることがわかりました。優れたプログラマであれば、これら 2 つの違いは知っていても、配列ではなく ArrayList を使用することをすでに知っています。 ArrayList をさらに進めると、オブジェクト文字列整数倍精度浮動小数点数など、ArrayList に格納される要素のデータ型を渡す機能が追加されます。 

構文:

 Arraylist  al = new ArrayList  ;  

注記: 動的なサイズを持つ Java の ArrayList (C++ のベクトルに相当)。サイズに応じて縮小または拡大できます。 ArrayList はコレクション フレームワークの一部であり、 java.util パッケージ 。 

構文:

 ArrayList   list = new ArrayList  <> ();  

ここで重要なことは、ここでの E はオブジェクトのデータ型を表しているということです。 整数 ここ。 Integer クラスはプリミティブ型の値をラップします。 整数 オブジェクトの中で。 Integer 型のオブジェクトには、int 型のフィールドが 1 つ含まれています。という概念を徹底してください ラッパークラス ここでバックエンドで機能するため、先に進む前に Java を使用してください。これをよく知っていれば理解がより明確になります。 オートボックス化とアンボックス化の概念 。これは、リスト内の要素に対して操作を実行するときに構文が異なるため、カスタム ArrayList に要素を追加するシナリオを考えて、それら 2 つの間の構文の違いに注目すると、概念の把握が困難になるためです。 

構文:

 ArrayList        al     = new Arraylist  () ;   
al.add(1) ;

構文:

 ArrayList      alobj     = new Arraylist() ;   
alobj(new Integer(1)) ;

以下に提供されているものを理解するためのサンプル図を取り上げてみましょう。

図:

Java のカスタム ArrayList

ここでは、一般によく使用する同じタイプの要素がすべて含まれています。ここで、同じ図式的なフローを提案してみましょう。ArrayList は、この画像に示されている方法で複数のデータをサポートするだけです。 

Java のカスタム ArrayList


上記の ArrayList では、格納されている要素が異なる型であることが明確にわかります。そこで、次のような概念が生まれます。 制限すること。この List だけでなく、単一の型に対応することで、ArrayList に存在できるデータ型の種類にアクセスできる、型ごとに List を作成する柔軟性が得られます。このリストは、Java では Custom ArrayList と呼ばれます。 カスタム ArrayList にはユーザーの要件に基づいた属性があり、複数の種類のデータを含めることができます。このデータは、さまざまなプリミティブ オブジェクト データ型の組み合わせによって形成されるカスタム内部クラスによって提供されます。

実装: 入力を次のように受け取る必要がある場合を考えてみましょう。 N 生徒数と詳細は次のとおりです。 

  • ロール番号
  • 名前
  • マーク
  • 電話番号

Java のカスタム Arraylist の概念を知らない場合は、以下に示す個別の ArrayList を作成することになるとします。 4 つの ArrayList を定義し、それぞれに応じてデータを保存します。

 ArrayList   roll = new ArrayList <>(); // roll number  
  ArrayList  name = new ArrayList <>(); // name  
 ArrayList   marks = new ArrayList <>(); // marks  
 ArrayList  phone = new ArrayList <>(); // phone number   

ここで、それぞれを反復して生徒データを取得することになり、以下に示すように、プログラムの時間の複雑さが大幅に増加します。

 for (int i = 0; i  < n; i++)    
{

// Adding all the values to each arraylist
// each arraylist has primitive datatypes

roll.add(rollnum_i);
name.add(name_i);
marks.add(marks_i);
phone.add(phone_i);
}

次に、上で学んだ概念を利用して、同じことを実装してみましょう。したがって、カスタム ArrayList を構築するには、以下にリストされている手順を次のように実行します。

手順: カスタム ArrayList の構築は次のとおりです。

  1. ArrayList オブジェクトを構築し、その型をクラス データとして配置します。
  2. クラスを定義し、必要なエンティティをコンストラクターに配置します。
  3. これらのエンティティをグローバル変数にリンクします。
  4. ArrayList から受け取るデータは、複数のデータを格納するクラス タイプです。

Java
   // Java program to illustrate Custom ArrayList   // Importing ArrayList class from java.util package   import     java.util.ArrayList  ;   // Class 1   // Outer class   // Main class   // CustomArrayList   class   Data     {      // Global variables of the class      int     roll  ;      String     name  ;      int     marks  ;      long     phone  ;      // Constructor has type of data that is required      Data  (  int     roll       String     name       int     marks       long     phone  )      {      // Initialize the input variable from main      // function to the global variable of the class      // this keyword refers to current instance      this  .  roll     =     roll  ;      this  .  name     =     name  ;      this  .  marks     =     marks  ;      this  .  phone     =     phone  ;      }   }   public     class   GFG     {      // Custom class which has data type class has      // defined the type of data ArrayList      // size of input 4      int     n     =     4  ;      // Class 2      // Inner class      // The custom datatype class      public     void     addValues  (  int     roll  []       String     name  []        int     marks  []       long     phone  []  )      {      // local custom arraylist of data type      // Data having (int String int long) type      // from the class      ArrayList   <  Data  >     list     =     new     ArrayList   <>  ();      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )     {      // create an object and send values to the      // constructor to be saved in the Data class      list  .  add  (  new     Data  (  roll  [  i  ]       name  [  i  ]       marks  [  i  ]        phone  [  i  ]  ));      }      // after adding values printing the values to      // test the custom arraylist      printValues  (  list  );      }      // Method 2      // To print the values      public     void     printValues  (  ArrayList   <  Data  >     list  )      {      // list- the custom arraylist is sent from      // previous function      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )     {      // Data received from arraylist is of Data      // type which is custom (int String int      // long) based on class Data      Data     data     =     list  .  get  (  i  );      // Print and display custom ArrayList      // elements that holds for student attribute      // Data variable of type Data has four      // primitive datatypes roll -int name-      // String marks- int phone- long      System  .  out  .  println  (  data  .  roll     +     ' '     +     data  .  name      +     ' '     +     data  .  marks     +     ' '      +     data  .  phone  );      }      }      // Method 1      // Main driver method      public     static     void     main  (  String     args  []  )      {      // Custom input data      int     roll  []     =     {     1       2       3       4     };      String     name  []      =     {     'Shubham'       'Atul'       'Ayush'       'Rupesh'     };      int     marks  []     =     {     100       99       93       94     };      long     phone  []     =     {     8762357381L       8762357382L        8762357383L       8762357384L     };      // Creating an object of the class      GFG     custom     =     new     GFG  ();      // Now calling function to add the values to the      // arraylist      custom  .  addValues  (  roll       name       marks       phone  );      }   }   

出力
1 Shubham 100 8762357381 2 Atul 99 8762357382 3 Ayush 93 8762357383 4 Rupesh 94 8762357384 

Java のカスタム ArrayList は、java.util.AbstractList クラスを拡張し、そのメソッドを実装することによって作成できます。カスタム ArrayList を作成する方法の例を次に示します。

Java
   import     java.util.AbstractList  ;   import     java.util.Arrays  ;   import     java.util.List  ;   public     class   CustomArrayList   <  E  >     extends     AbstractList   <  E  >     {      private     int     size     =     0  ;      private     static     final     int     DEFAULT_CAPACITY     =     10  ;      private     Object     elements  []  ;      public     CustomArrayList  ()     {      elements     =     new     Object  [  DEFAULT_CAPACITY  ]  ;      }      public     CustomArrayList  (  int     capacity  )     {      elements     =     new     Object  [  capacity  ]  ;      }      @Override      public     int     size  ()     {      return     size  ;      }      @Override      public     E     get  (  int     index  )     {      if     (  index     >=     size     ||     index      <     0  )     {      throw     new     IndexOutOfBoundsException  (  'Index: '     +     index     +     ' Size '     +     index  );      }      return     (  E  )     elements  [  index  ]  ;      }      @Override      public     void     add  (  int     index       E     element  )     {      if     (  index     >     size     ||     index      <     0  )     {      throw     new     IndexOutOfBoundsException  (  'Index: '     +     index     +     ' Size '     +     index  );      }      ensureCapacity  ();      for     (  int     i     =     size     -     1  ;     i     >=     index  ;     i  --  )     {      elements  [  i     +     1  ]     =     elements  [  i  ]  ;      }      elements  [  index  ]     =     element  ;      size  ++  ;      }      @Override      public     E     remove  (  int     index  )     {      if     (  index     >=     size     ||     index      <     0  )     {      throw     new     IndexOutOfBoundsException  (  'Index: '     +     index     +     ' Size '     +     index  );      }      Object     item     =     elements  [  index  ]  ;      for     (  int     i     =     index  ;     i      <     size     -     1  ;     i  ++  )     {      elements  [  i  ]     =     elements  [  i     +     1  ]  ;      }      size  --  ;      return     (  E  )     item  ;      }      private     void     ensureCapacity  ()     {      int     newSize     =     elements  .  length     *     2  ;      elements     =     Arrays  .  copyOf  (  elements       newSize  );      }      public     static     void     main  (  String  []     args  )     {      List   <  Integer  >     list     =     new     CustomArrayList   <>  ();      list  .  add  (  1  );      list  .  add  (  2  );      list  .  add  (  3  );      System  .  out  .  println  (  'CustomArrayList: '     +     list  );      }   }   

出力
CustomArrayList: [1 2 3] 

この例では、AbstractList クラスを拡張し、そのメソッド size get add および delete を実装することによって、カスタム ArrayList が作成されます。カスタム ArrayList には、スペースが不足した場合に ArrayList のサイズを 2 倍にする ensureCapacity と呼ばれるプライベート メソッドもあります。

Java でカスタム ArrayList を使用する利点:

  1. 柔軟性: カスタム ArrayList を作成すると、アプリケーションの特定のニーズに合わせて ArrayList の動作をカスタマイズできます。
  2. 理解: 独自の ArrayList を最初から作成すると、ArrayList がどのように機能するか、また ArrayList を効果的に使用する方法を理解するのに役立ちます。

Java でカスタム ArrayList を使用する場合の欠点:

  1. 時間の消費: カスタム ArrayList の作成には時間がかかり、適切な設定が必要です。

クイズの作成