Java のカスタム ArrayList
先に進む前に、の概念を簡単に修正しましょう。 配列 そして 配列リスト 素早く。 Java では、配列がメモリ アドレス空間に要素を連続的に追加する機能を提供する線形データ構造であるのに対し、ArrayList は Collection フレームワークに属するクラスであることがわかりました。優れたプログラマであれば、これら 2 つの違いは知っていても、配列ではなく ArrayList を使用することをすでに知っています。 ArrayList をさらに進めると、オブジェクト文字列整数倍精度浮動小数点数など、ArrayList に格納される要素のデータ型を渡す機能が追加されます。
構文:
Arraylistal = new ArrayList ; 注記: 動的なサイズを持つ Java の ArrayList (C++ のベクトルに相当)。サイズに応じて縮小または拡大できます。 ArrayList はコレクション フレームワークの一部であり、 java.util パッケージ 。
構文:
ArrayListlist = new ArrayList <> (); ここで重要なことは、ここでの E はオブジェクトのデータ型を表しているということです。 整数 ここ。 Integer クラスはプリミティブ型の値をラップします。 整数 オブジェクトの中で。 Integer 型のオブジェクトには、int 型のフィールドが 1 つ含まれています。という概念を徹底してください ラッパークラス ここでバックエンドで機能するため、先に進む前に Java を使用してください。これをよく知っていれば理解がより明確になります。 オートボックス化とアンボックス化の概念 。これは、リスト内の要素に対して操作を実行するときに構文が異なるため、カスタム ArrayList に要素を追加するシナリオを考えて、それら 2 つの間の構文の違いに注目すると、概念の把握が困難になるためです。
構文:
ArrayListal = new Arraylist () ;
al.add(1) ;構文:
ArrayList alobj = new Arraylist() ;
alobj(new Integer(1)) ;以下に提供されているものを理解するためのサンプル図を取り上げてみましょう。
図:
![]()
ここでは、一般によく使用する同じタイプの要素がすべて含まれています。ここで、同じ図式的なフローを提案してみましょう。ArrayList は、この画像に示されている方法で複数のデータをサポートするだけです。
![]()
上記の ArrayList では、格納されている要素が異なる型であることが明確にわかります。そこで、次のような概念が生まれます。 制限すること。この List だけでなく、単一の型に対応することで、ArrayList に存在できるデータ型の種類にアクセスできる、型ごとに List を作成する柔軟性が得られます。このリストは、Java では Custom ArrayList と呼ばれます。 。 カスタム ArrayList にはユーザーの要件に基づいた属性があり、複数の種類のデータを含めることができます。このデータは、さまざまなプリミティブ オブジェクト データ型の組み合わせによって形成されるカスタム内部クラスによって提供されます。実装: 入力を次のように受け取る必要がある場合を考えてみましょう。 N 生徒数と詳細は次のとおりです。
- ロール番号
- 名前
- マーク
- 電話番号
Java のカスタム Arraylist の概念を知らない場合は、以下に示す個別の ArrayList を作成することになるとします。 4 つの ArrayList を定義し、それぞれに応じてデータを保存します。
ArrayListroll = new ArrayList <>(); // roll number ArrayListname = new ArrayList <>(); // name ArrayListmarks = new ArrayList <>(); // marks ArrayListphone = 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 の構築は次のとおりです。
- ArrayList オブジェクトを構築し、その型をクラス データとして配置します。
- クラスを定義し、必要なエンティティをコンストラクターに配置します。
- これらのエンティティをグローバル変数にリンクします。
- 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 8762357384Java のカスタム ArrayList は、java.util.AbstractList クラスを拡張し、そのメソッドを実装することによって作成できます。カスタム ArrayList を作成する方法の例を次に示します。
Javaimport 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 を使用する利点:
- 柔軟性: カスタム ArrayList を作成すると、アプリケーションの特定のニーズに合わせて ArrayList の動作をカスタマイズできます。
- 理解: 独自の ArrayList を最初から作成すると、ArrayList がどのように機能するか、また ArrayList を効果的に使用する方法を理解するのに役立ちます。
Java でカスタム ArrayList を使用する場合の欠点:
- 時間の消費: カスタム ArrayList の作成には時間がかかり、適切な設定が必要です。
クイズの作成