【数据结构(二)】顺序表与ArrayList

news/2024/5/20 9:50:45 标签: 数据结构, java, 开发语言, 顺序表, LinkList

❣博主主页: 33的博客❣
▶文章专栏分类:数据结构
🚚我的代码仓库: 33的代码仓库🚚
🫵🫵🫵关注我带你学更多数据结构知识

在这里插入图片描述

目录

  • 1.前言
  • 2.定义IList接口
  • 3.MyArraylist实现接口
    • 3.1定义成员变量与构造方法
    • 3.2添加元素
    • 3.3 是否包某一个元素
    • 3.4f返回某个值的下标
    • 3.5获取某一个下标的值
    • 3.6删除某一个值
    • 3.7遍历
    • 3.8判空与判满
    • 3.9清除所有元素
  • 4.ArrayList
    • 4.1ArrayList构造
    • 4.2 ArrayList常见操作
    • 4.3 ArrayList的遍历
  • 5.ArrayList具体使用
    • 5.1杨辉三角
    • 5.2简单洗牌算法
  • 6.总结

1.前言

在计算机科学中,数据结构是处理和组织数据的方法和技术。顺序表是一种常见的线性表数据结构,它基于数组实现,提供了快速的随机访问能力。本篇文章将详细介绍顺序表的定义、特点以及常见操作。

本章重点

自己完成一个顺序表,并实现增,删,改,查等操作,实现杨辉三角,简单洗牌算法。


2.定义IList接口

java">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();

    boolean isFull();

    public boolean isEmpty();
}

3.MyArraylist实现接口

3.1定义成员变量与构造方法

java">public static final int LEN=10;
    public  int[] arr;
    public int usesize=0;
    public MyArraylist(){
        this.arr=new int[LEN];
    }

3.2添加元素

1.添加元素到末尾

java">public void add(int data) {
        //检查是否满了,满了就扩容
        if(isFull()){
            chekCapacity();
        }
        arr[usesize]=data;
        usesize++;
    }
public void chekCapacity(){
       arr= Arrays.copyOf(arr,arr.length*2);
    }    

2.指定某一个位置添加

java"> public void add(int pos, int data) {
       if(isFull()) {
            chekCapacity();
        }
    if(pos<0||pos>=arr.length){
        System.out.println("位置不合法");
    }else {
        for(int i=usesize-1;i>=pos;i--){
            arr[i+1]=arr[i];
        }
        arr[pos]=data;
    }
    usesize++;
    }

测试结果:
在这里插入图片描述


3.3 是否包某一个元素

java">public boolean contains(int toFind) {
        for (int i=0;i<usesize;i++){
            if(arr[i]==toFind){
                return true;
            }
        }
        return false;
    }

测试结果:
在这里插入图片描述


3.4f返回某个值的下标

java">public int indexOf(int toFind) {
        for (int i=0;i<usesize;i++){
            if(arr[i]==toFind){
                return i;
            }
        }
        return -1;
    }

测试结果:
在这里插入图片描述


3.5获取某一个下标的值

java">public int get(int pos) {
 if(pos<0||pos>usesize){
            System.out.println("位置不合法");
        }
 return arr[pos];
 }

测试结果:
在这里插入图片描述


3.6删除某一个值

java">public void remove(int toRemove) {
    if(isEmpty()){
        System.out.println("已为空,不能删除");
    }else {
        int pos=indexOf(toRemove);
        for(int i=pos;i<usesize-1;i++){
            arr[i]=arr[i+1];
        }
    }
    usesize--;
    }

测试结果:
在这里插入图片描述


3.7遍历

java">public void display() {
    for (int i=0;i<usesize;i++){
        System.out.print(arr[i]+" ");
    }
    }

测试结果:
在这里插入图片描述


3.8判空与判满

java">public boolean isFull() {
        return usesize==arr.length;
    }
public boolean isEmpty() {
        return usesize==0;
    }
}

测试结果:
在这里插入图片描述


3.9清除所有元素

java">public void clear() {
        usesize = 0;
    }

测试结果:
在这里插入图片描述


4.ArrayList

实际上自己实现一个顺序表是非常简单容易的,在数据结构中已经写好了顺序表ArrayList,我们只需要用即可,但我们只有了解底层是如何实现的,才能更好的使用。
在这里插入图片描述
从源码我们可以看出,ArrayList实现了List接口,ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问,.ArrayList实现了Cloneable接口,表明ArrayList是可以clone的,ArrayList实现了Serializable接口,表明ArrayList是支持序列化的。

4.1ArrayList构造

在这里插入图片描述

java">//无参构造一个空的列表
ArrayList<Integer> list1=new ArratList<>();
//构造一个容量为10的列表
ArrayList<Integer> list2=new ArratList<>(10);
// list3构造好之后,与list中的元素一致,实现了collection接口,为Integer的子类或者本身
ArrayList<Integer> list3=new ArratList<>(list2);

4.2 ArrayList常见操作

在这里插入图片描述


4.3 ArrayList的遍历

rrayList 可以使用三方方式遍历:for循环+下标、foreach、使用迭代器。

java"> public static void main(String[] args) {
    List<Integer> list = new ArrayList<>();
    list.add(1);
    list.add(2);
    list.add(3);
    // 使用下标+for遍历
    for (int i = 0; i < list.size(); i++) {
        System.out.print(list.get(i) + " ");
    }
    System.out.println();
    // 借助foreach遍历
    for (Integer integer : list) {
        System.out.print(integer + " ");
    }
    //迭代器
    Iterator<Integer> it = list.listIterator();
    while(it.hasNext()){
        System.out.print(it.next() + " ");
    }
    System.out.println();
 }

5.ArrayList具体使用

5.1杨辉三角

java">class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> list=new ArrayList<>();
        List<Integer> l=new ArrayList<>();
        //设置第一行的数字
        l.add(1);
        list.add(l);
        for (int i=1;i<numRows;i++){
            //设置每一行第一个元素
            List<Integer> cur=new ArrayList<>();
            cur.add(1);
            List<Integer> pre=list.get(i-1);
            for (int j=1;j<i;j++){
                cur.add(pre.get(j)+pre.get(j-1));
            }
            //设置每一行最后一个元素
            cur.add(1);
            
            list.add(cur);
        }
        return list;
    }
}

5.2简单洗牌算法

Card类型

java">public class Card {
    private String suit;//花色
    private int rank;//数字

    public Card(String suit, int rank) {
        this.suit = suit;
        this.rank = rank;
    }

    public String getSuit() {

        return suit;
    }

    public void setSuit(String suit) {

        this.suit = suit;
    }

    public int getRank() {

        return rank;
    }

    public void setRank(int rank) {

        this.rank = rank;
    }

    @Override
    public String toString() {

        return suit+":"+rank+" ";
    }
}

//买牌、洗牌、发牌

java">import java.util.ArrayList;
import java.util.List;
import java.util.Random;
//一副新牌
public class CardDemo {
    final String[] suit={"♥","♦","♣","♠"};

    public List<Card> buycard(){
        List<Card> cards=new ArrayList<>();
        for (int i=0;i<4;i++){
            for (int j=0;j<13;j++){
                Card card=new Card(suit[i],j);
                cards.add(card);
            }
        }
        System.out.println(cards);
        return cards;
    }
    //洗牌
public void shuffle(List<Card> cards){
    Random random=new Random();
    for (int i=cards.size()-1;i>0;i--){
       int change=random.nextInt(i);
       //交换i位置与change位置的牌
       Card tmp=cards.get(i);
       cards.set(i,cards.get(change));
       cards.set(change,tmp);
    }
    System.out.println(cards);
}
    //三人轮流拿5张牌
    public void getCard(List<Card> cards){
        List<Card> L1=new ArrayList<>();
        List<Card> L2=new ArrayList<>();
        List<Card> L3=new ArrayList<>();
        List<List<Card>> list=new ArrayList<>();
        list.add(L1);
        list.add(L2);
        list.add(L3);
        for(int j=0;j<5;j++){
            for (int i=0;i<3;i++){
                Card card=cards.remove(0);
                list.get(i).add(card);
            }
        }
        System.out.println("第一个人拿牌");
        System.out.println(L1);
        System.out.println("第二个人拿牌");
        System.out.println(L2);
        System.out.println("第三个人拿牌");
        System.out.println(L3);
    }

}

Test

java">public static void main(String[] args) {
    CardDemo cardDemo=new CardDemo();
    List<Card> cards=cardDemo.buycard();
    cardDemo.shuffle(cards);
    cardDemo.getCard(cards);
}

6.总结

本篇文章完成一个顺序表,并实现增,删,改,查等操作,实现杨辉三角,简单洗牌算法。

下期预告:链表与LinkedList


http://www.niftyadmin.cn/n/5473813.html

相关文章

ElasticSearch 中分词与倒排索引的原理

首先是给检索用的。 英文&#xff1a;一个单词一个词&#xff0c;很简单。I am a student&#xff0c;词与词之间空格分隔。中文&#xff1a;我是学生&#xff0c;就不能一个字一个字地分&#xff0c;我-是-学生。这是好分的。还有歧义的&#xff0c;使用户放心&#xff0c;使…

金融中的数学模型

平稳时间序列 时间序列的基本统计特性&#xff0c;如均值、方差和自相关等&#xff0c;在时间上不随时间的推移而发生显著的变化。 平稳时间序列通常具有以下特征&#xff1a; 均值不随时间变化&#xff1a;序列的均值在时间上保持恒定。方差不随时间变化&#xff1a;序列的…

算法之美:缓存数据淘汰算法分析及分解实现

在设计一个系统的时候&#xff0c;由于数据库的读取速度远小于内存的读取速度&#xff0c;那么为加快读取速度&#xff0c;需先将一部分数据加入到内存中&#xff08;该动作称为缓存&#xff09;&#xff0c;但是内存容量又是有限的&#xff0c;当缓存的数据大于内存容量时&…

通过 Cookie、Redis共享Session 和 Spring 拦截器技术,实现对用户登录状态的持有和清理(四)

本篇内容对应 “2.5 开发登录、退出功能” 小节 “4.7 优化登陆模块” 小节 2.6 显示登录信息 2.7 账号设置 2.8 检查登录状态 登录功能的流程是什么&#xff1f; UUID为什么不会重复&#xff1f; 因为UUID是基于mac物理地址、时间戳、随机数等信息生成。因此UUID居于极高的唯…

【图网络】四种中心性

中心性度量在网络分析中至关重要&#xff0c;有助于识别图中最重要的顶点。不同的中心性度量度量了不同类型的重要性。下面是这些中心性和适合它们的场景之间的区别: 度中心 *: Degree Centrality 定义:节点的度中心性就是它拥有的边的数量。在邻接矩阵中&#xff0c;它是行或…

中颖51芯片学习2. IO端口操作

一、SH79F9476 I/O端口介绍 1. 特性 SH79F9476提供了30/26位可编程双向 I/O 端口&#xff1b;端口数据在寄存器Px中&#xff1b;端口控制寄存器PxCRy是控制端口作为输入还是输出&#xff1b;端口作为输入时&#xff0c;每个I/O端口均带有PxPCRy控制的内部上拉电阻。有些I/O引…

UVC紫外杀菌灯珠-消毒杀菌应用解决方案

随着疾病传播的频繁发生以及人们对卫生健康的重视&#xff0c;有效的杀菌措施&#xff0c;更好的消毒杀菌技术越来越重要&#xff0c;为此&#xff0c;工采网提供一系列UVC紫外杀菌灯珠产品&#xff0c;为客户提供适应不同功能应用的UVC杀菌方案。 UVC紫外线杀菌是一种高效、安…

大模型的Base版本模型、Chat版本模型和4Bit版本模型有什么区别

在最近开源的大部分大语言模型里&#xff0c;我们往往能看到在huggingface上&#xff0c;同一数据量级会有Base版本模型、Chat版本模型和4Bit模型等多个版本的模型&#xff0c;像我一样的新手小白可能会搞不清楚我应该用哪个来使用 下面是一些总结&#xff1a; Base版本模型&a…