文章目录
- 前言
- 一、什么是顺序表?
- 1.1 顺序表的概念
- 1.2 顺序表的建立
- 二、MyArrayList的实现
- 三、顺序表的方法
- 四、关于顺序表的例子
- 总结
前言
提示:这里涉及到的ArrayList类是一个泛型类,同时后面的很多内容都会涉及到泛型,如果不了解泛型,可以在我给出的链接中查看了解一下,比较简单>>
JAVA泛型<<
一、什么是顺序表?
1.1 顺序表的概念
概念的内容来源于>>
ArrayList
ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。
它的本质就是一个数组。只不过这个数组在容量达到上限后会自动将数组进行扩容,但是,不是在同一个数组上而是返回一个扩容后的新数组,将原来数组上的内容复制到新的数组上,给我们一种直接扩容的感觉
1.2 顺序表的建立
import java.util.ArrayList; // 引入 ArrayList 类
ArrayList<E> objectName = new ArrayList<>(); // 初始化
补充内容
我当时想直接用original这个对象进行clone发现是不行的,List是个接口,不是个类,没有实现Cloneable接口,无法克隆。
同时Array.asList,这个方法返回的是一个固定的视图,
当我们想在这个对象中加数据时我们会发现
这是为什么呢?
解释:
Arrays.asList(1, 2, 3)返回的是一个java.util.Arrays.ArrayList类型的对象,它并不是java.util.ArrayList类型。虽然它们都实现了List接口,但不能直接进行强制类型转换。同时因为它们都实现了List接口,所以,以List 为类型的引用可以接收Arrays.asList的返回值
二、MyArrayList的实现
将需要实现的方法放在一个接口中,在通过自定义类实现这个接口
public interface IList {
// 新增元素,默认在数组最后新增
public void add(int data);
// 在 pos 位置新增元素
public void add(int pos, int data);
// 判定是否包含某个元素
public boolean contains(int toFind);
// 查找某个元素对应的位置
public int indexOf(int toFind);
// 获取 pos 位置的元素
public int get(int pos);
// 给 pos 位置的元素设为 value
public void set(int pos, int value);
//删除第一次出现的关键字key
public void remove(int toRemove);
// 获取顺序表长度
public int size();
// 清空顺序表
public void clear();
// 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
public void display();
}
自定义的顺序表
import java.util.Arrays;
public class MyArrayList implements IList{
public int[] array;
private static final int DEFAULT_CAPACITY = 10;
public MyArrayList(){
this.array = new int[DEFAULT_CAPACITY];
}
private int useSide;
//判断数组是否满了
private boolean isFull(int[] array){
if(array.length == DEFAULT_CAPACITY){
//如果长度等于初始容量,说明数组满了
return true;
}
return false;
}
//扩容数组
private int[] grow(int[] array){
return Arrays.copyOf(this.array,array.length*2);
}
@Override
// 新增元素,默认在数组最后新增
public void add(int data) {
if (isFull(this.array)){
this.array = grow(this.array);
}
array[useSide] = data;
useSide++;
}
//判断pos是否正确
private void checkpos(int pos){
try {
if(pos < 0 || pos > this.useSide){
throw new OutOfArrayException("越界异常");
}
}catch (OutOfArrayException e){
e.printStackTrace();
}
}
@Override
// 在 pos 位置新增元素
public void add(int pos, int data) {
try {
checkpos(pos);
if (isFull(this.array)){
this.array = grow(this.array);
}
for (int i = this.useSide - 1; i >= pos; i--) {
array[i+1] = array[i];
}
array[pos] = data;
this.useSide++;
}catch (OutOfArrayException e){
e.printStackTrace();
}
}
@Override
// 判定是否包含某个元素
public boolean contains(int toFind) {
for (int i = 0; i < this.useSide; i++) {
if(toFind == this.array[i]){
return true;
}
}
return false;
}
@Override
// 查找某个元素对应的位置
public int indexOf(int toFind) {
for (int i = 0; i < this.useSide; i++) {
if(toFind == this.array[i]){
return i;
}
}
return -1;
}
private void isEmpty(int[] array){
if(empty(array)){
throw new IsEmptyException("空数组越界访问");
}
}
private boolean empty(int[] array){
return array.length == 0;
}
@Override
// 获取 pos 位置的元素
public int get(int pos) {
try {
checkpos(pos);
isEmpty(this.array);
return this.array[pos];
}catch (OutOfArrayException | IsEmptyException e){
e.printStackTrace();
}
return -1;
}
@Override
// 给 pos 位置的元素设为 value
public void set(int pos, int value) {
try {
checkpos(pos);
isEmpty(this.array);
array[pos] = value;
}catch (OutOfArrayException | IsEmptyException e){
e.printStackTrace();
}
}
@Override
//删除第一次出现的关键字key
public void remove(int toRemove) {
try {
isEmpty(this.array);
int m = indexOf(toRemove);
for (int i = m; i < this.useSide - 1; i++) {
array[i] = array[i+1];
}
this.useSide--;
}catch (IsEmptyException e){
e.printStackTrace();
}
}
@Override
// 获取顺序表长度
public int size() {
return this.useSide;
}
@Override
// 清空顺序表
public void clear() {
this.useSide = 0;
}
@Override
// 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
public void display() {
for (int i = 0; i < this.useSide; i++) {
System.out.print(array[i] + " ");
}
System.out.println();
}
}
自定义的异常OutOfArrayException,超出数组范围
public class OutOfArrayException extends RuntimeException{
public OutOfArrayException(){
super();
}
public OutOfArrayException(String m){
super(m);
}
}
自定义异常,数组为空
public class IsEmptyException extends RuntimeException{
public IsEmptyException(){
super();
}
public IsEmptyException(String m){
super(m);
}
}
测试类
public class Test {
public static void main(String[] args) {
MyArrayList myArrayList = new MyArrayList();
myArrayList.add(10);
myArrayList.add(10);
myArrayList.add(2,99);
myArrayList.add(10);
myArrayList.add(10);
myArrayList.display();
System.out.println(myArrayList.get(2));
System.out.println(myArrayList.indexOf(10));
}
}
三、顺序表的方法
四、关于顺序表的例子
题目来源>>杨辉三角<<
public class Test {
public static List<List<Integer>> generate(int numRows) {
if(numRows <= 0){
return null;
}
List<List<Integer>> array = new ArrayList<>();
for(int i = 0;i < numRows;i++){
array.add(new ArrayList<>());
}
array.get(0).add(1);
for(int i = 1 ; i < numRows ;i++){
array.get(i).add(1);
for(int j = 1; j < i; j++){
array.get(i).add(array.get(i-1).get(j)+array.get(i-1).get(j-1));
}
array.get(i).add(1);
}
return array;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int s = scanner.nextInt();
List<List<Integer>> array = generate(s);
for (int i = 0; i < s; i++) {
System.out.println(array.get(i));
}
}
}
总结
本篇文章,介绍了有关顺序表的内容,包括什么是顺序表、如何实现自己的顺序表、以及使用顺序表解决问题的例子。