Java自定义数组列表

Java自定义数组列表

在Java中可以利用自定义接口,实现类似于ArrayList的自定义功能。
首先 我们创建一个接口,在里面定义我们想要实现的功能,如一个数组列表,我们想实现添加、删除、获取长度、修改等。

public interface MyList<E> {
	void add(E e);
	int getSize();
	E get(int index);
	void det(int index);
	void change(int index,E e);
}

这样我们就自定义出了一个接口,这里还用了泛型,方便对所有的数据类型,这个数组列表都能使用,泛型的介绍本文就不过多的解释。

接着,就可以新建一个类来接这个接口并重新编写构造方法来实现这个数组列表应该有的功能

public class ArList<E> implements MyList<E> {

}

首先是获取数据的功能,因为这里是采用了泛型,所以我们不知道输入的数据是什么类型的,所以我用了Object来存储数据

Object[] data;
public E get(int index) {
  return (E) data[index];
 }

接着是添加与删除,添加的思路是构造一个新的数组,他的大小等于原数组大小+1,然后依次将原数组的数据赋值到新数组,最后把新数组传给原数组data,最后把要添加的数据添加到多出来的这一位的大小里,就相当于数组变大了(参考ArrayList,如果数据过大,可以直接扩大1.5倍左右,减少运算时间,提高效率)。

public void add(E e) {
  Object[] newdata = new Object[Size + 1];
  for (int i = 0; i < Size; i++) {
   newdata[i] = data[i];
  }
  data = newdata;
  data[Size++] = e;
 }

public void det(int index) {
  Object[] newdata = new Object[Size - 1];
  int j = 0;
  for (int i = 0; i < index; i++) {
   newdata[j] = data[i];
   j++;
  }
  for (int i = index + 1; i < Size; i++) {
   newdata[j] = data[i];
   j++;
  }
  data = newdata;
  Size--;
 }

最后是其他功能

public void change(int index, E e) {
  data[index] = e;
 }
public int getSize() {
  return Size;
 }

测试

public static void main(String[] args) {
  ArList<String> al = new ArList<>();
  al.add("1");
  al.add("2");
  al.add("3");
  al.add("4");
  al.add("5");
  for (int i = 0; i < al.getSize(); i++) {
   System.out.println(al.get(i));
  }
  al.det(2);
  al.change(3, "7");
  for (int i = 0; i < al.getSize(); i++) {
   System.out.println(al.get(i));
  }

结果

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮你解答这个问题。 首先,我们需要定义一个自定义数组类,可以使用以下代码: ```java public class MyArray { private int[] data; private int size; public MyArray(int capacity) { data = new int[capacity]; size = 0; } public MyArray() { this(10); } public int getSize() { return size; } public int getCapacity() { return data.length; } public boolean isEmpty() { return size == 0; } public void add(int index, int e) { if (index < 0 || index > size) throw new IllegalArgumentException("Add failed. Index is illegal."); if (size == data.length) resize(2 * data.length); for (int i = size - 1; i >= index; i--) data[i + 1] = data[i]; data[index] = e; size++; } public void addLast(int e) { add(size, e); } public void addFirst(int e) { add(0, e); } public int get(int index) { if (index < 0 || index >= size) throw new IllegalArgumentException("Get failed. Index is illegal."); return data[index]; } public void set(int index, int e) { if (index < 0 || index >= size) throw new IllegalArgumentException("Set failed. Index is illegal."); data[index] = e; } public boolean contains(int e) { for (int i = 0; i < size; i++) if (data[i] == e) return true; return false; } public int find(int e) { for (int i = 0; i < size; i++) if (data[i] == e) return i; return -1; } public int remove(int index) { if (index < 0 || index >= size) throw new IllegalArgumentException("Remove failed. Index is illegal."); int ret = data[index]; for (int i = index + 1; i < size; i++) data[i - 1] = data[i]; size--; if (size == data.length / 4 && data.length / 2 != 0) resize(data.length / 2); return ret; } public int removeFirst() { return remove(0); } public int removeLast() { return remove(size - 1); } public void removeElement(int e) { int index = find(e); if (index != -1) remove(index); } private void resize(int newCapacity) { int[] newData = new int[newCapacity]; for (int i = 0; i < size; i++) newData[i] = data[i]; data = newData; } @Override public String toString() { StringBuilder res = new StringBuilder(); res.append(String.format("Array: size = %d , capacity = %d\n", size, data.length)); res.append('['); for (int i = 0; i < size; i++) { res.append(data[i]); if (i != size - 1) res.append(", "); } res.append(']'); return res.toString(); } } ``` 上述代码中,我们定义了一个 `MyArray` 类,包括以下成员变量和方法: - `data`:用来存放数组元素的数组; - `size`:当前数组中有效元素的个数; - `MyArray(int capacity)`:构造函数,创建一个容量为 `capacity` 的数组; - `MyArray()`:无参构造函数,创建一个默认容量为 10 的数组; - `getSize()`:获取当前数组中有效元素的个数; - `getCapacity()`:获取当前数组的容量; - `isEmpty()`:判断当前数组是否为空; - `add(int index, int e)`:在指定位置插入一个元素; - `addLast(int e)`:在数组末尾插入一个元素; - `addFirst(int e)`:在数组头部插入一个元素; - `get(int index)`:获取指定位置的元素; - `set(int index, int e)`:修改指定位置的元素; - `contains(int e)`:判断数组中是否包含指定元素; - `find(int e)`:查找指定元素的下标,若不存在则返回 -1; - `remove(int index)`:移除指定位置的元素; - `removeFirst()`:移除数组头部的元素; - `removeLast()`:移除数组末尾的元素; - `removeElement(int e)`:移除数组中第一个与指定元素相等的元素; - `resize(int newCapacity)`:调整数组的容量; - `toString()`:将数组转化为字符串形式。 这个自定义数组类实现了添加、删除、修改和获得长度的操作。你可以根据需要进行调用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值