Java 自定义ArrayList
在进一步进行之前,让我们快速地回顾一下 数组 和 ArrayList 的概念。在java中,我们已经看到数组是线性数据结构,提供了在内存地址空间中连续添加元素的功能,而ArrayList是一个属于集合框架的类。作为一个优秀的程序员,尽管知道这两者之间的区别,但已经知道使用ArrayList而不是数组。现在,即使是ArrayList,也有一个功能可以传递元素的数据类型,这些元素应该被存储在ArrayList中,无论是对象、字符串、整数、double、浮点数等等。
语法
Arraylist<DataType> al = new ArrayList<Datatype> ;
注意: Java中的ArrayList(相当于C++中的向量)具有动态大小。它可以根据大小缩减或扩展。ArrayList是集合框架的一部分,存在于java.util包中。
语法
ArrayList <E> list = new ArrayList <> ();
这里重要的是,E在这里代表一个对象数据类型,想象一下,这里是 Integer 。Integer类将一个原始类型 int 的值包装在一个对象中。一个Integer类型的对象包含一个类型为int的单一字段。在前进之前,请先了解一下java中封装类的概念,因为如果我们清楚地知道自动装箱和拆箱的概念,它将在后端使理解更加清晰。这是因为在对列表中的元素进行操作时,它们的语法会有所不同,所以对概念的掌握会有所欠缺,假设考虑一个向自定义ArrayList添加元素的场景,并注意它们之间语法的差异。
语法
ArrayList<Integer> **al** = new Arraylist<Integer>() ;
**al.add(1)** ;
语法
ArrayList alobj = new Arraylist() ;
alobj(new Integer(1));
让我们举一个例子来感知,下面提供的例子如下。
示例
在这里,我们有所有相同类型的元素,一般来说,我们经常使用。现在让我们提出同样的图示流程,ArrayList简单地支持多个数据,其方式如图所示。
在上面的ArrayList中,我们可以清楚地看到,被存储的元素是不同的类型。因此,它确实爆发了 的概念,限制在一个单一的类型,不仅如此,List还为我们提供了灵活性,可以根据我们的类型制作List,我们可以在ArrayList中访问什么类型的数据。这种列表被称为java中的自定义ArrayList 。 自定义ArrayList具有基于用户需求的属性,并且可以有超过一种类型的数据。这些数据是由一个自定义的内部类提供的,它是由各种原始对象数据类型组合而成的。
实现: 考虑一个案例,当我们必须接受 N 个学生的输入,细节是。
- 卷号
- 姓名
- 分数
- 电话
假设我们不知道java中自定义Arraylist的概念,那么我们就会制作下面列出的单个ArrayLists。我们定义了4个ArrayLists并在每个ArrayLists中保存相应的数据。
ArrayList<Integer> roll = new ArrayList<>(); // roll number
ArrayList<String> name = new ArrayList<>(); // name
ArrayList<Integer> marks = new ArrayList<>(); // marks
ArrayList<Long> 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如下。
- 建立一个ArrayList对象,并将其类型定为类数据。
- 定义一个类,并将所需的实体放在构造函数中。
- 将这些实体链接到全局变量。
- 从ArrayList中收到的数据是那个存储多个数据的类的类型。
例子
// 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 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
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;
}
}
// 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);
}
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);
}
}
}
输出
1 Shubham 100 8762357381
2 Atul 99 8762357382
3 Ayush 93 8762357383
4 Rupesh 94 8762357384