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

这篇具有很好参考价值的文章主要介绍了【数据结构(二)】顺序表与ArrayList。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

【数据结构(二)】顺序表与ArrayList,数据结构,数据结构,java,开发语言,顺序表,LinkList

1.前言

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

本章重点

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


2.定义IList接口

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定义成员变量与构造方法

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

3.2添加元素

1.添加元素到末尾

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

2.指定某一个位置添加

 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++;
    }

测试结果:
【数据结构(二)】顺序表与ArrayList,数据结构,数据结构,java,开发语言,顺序表,LinkList


3.3 是否包某一个元素

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

测试结果:
【数据结构(二)】顺序表与ArrayList,数据结构,数据结构,java,开发语言,顺序表,LinkList


3.4f返回某个值的下标

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

测试结果:
【数据结构(二)】顺序表与ArrayList,数据结构,数据结构,java,开发语言,顺序表,LinkList


3.5获取某一个下标的值

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

测试结果:
【数据结构(二)】顺序表与ArrayList,数据结构,数据结构,java,开发语言,顺序表,LinkList


3.6删除某一个值

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--;
    }

测试结果:
【数据结构(二)】顺序表与ArrayList,数据结构,数据结构,java,开发语言,顺序表,LinkList


3.7遍历

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

测试结果:
【数据结构(二)】顺序表与ArrayList,数据结构,数据结构,java,开发语言,顺序表,LinkList


3.8判空与判满

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

测试结果:
【数据结构(二)】顺序表与ArrayList,数据结构,数据结构,java,开发语言,顺序表,LinkList


3.9清除所有元素

public void clear() {
        usesize = 0;
    }

测试结果:
【数据结构(二)】顺序表与ArrayList,数据结构,数据结构,java,开发语言,顺序表,LinkList


4.ArrayList

实际上自己实现一个顺序表是非常简单容易的,在数据结构中已经写好了顺序表ArrayList,我们只需要用即可,但我们只有了解底层是如何实现的,才能更好的使用。
【数据结构(二)】顺序表与ArrayList,数据结构,数据结构,java,开发语言,顺序表,LinkList
从源码我们可以看出,ArrayList实现了List接口,ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问,.ArrayList实现了Cloneable接口,表明ArrayList是可以clone的,ArrayList实现了Serializable接口,表明ArrayList是支持序列化的。

4.1ArrayList构造

【数据结构(二)】顺序表与ArrayList,数据结构,数据结构,java,开发语言,顺序表,LinkList

//无参构造一个空的列表
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常见操作

【数据结构(二)】顺序表与ArrayList,数据结构,数据结构,java,开发语言,顺序表,LinkList


4.3 ArrayList的遍历

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

 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杨辉三角

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类型

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+" ";
    }
}

//买牌、洗牌、发牌

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

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

6.总结

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

下期预告:链表与LinkedList文章来源地址https://www.toymoban.com/news/detail-849240.html

到了这里,关于【数据结构(二)】顺序表与ArrayList的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构(Java实现)-ArrayList与顺序表

    什么是List List是一个接口,继承自Collection。 List的使用 List是个接口,并不能直接用来实例化。 如果要使用,必须去实例化List的实现类。在集合框架中,ArrayList和LinkedList都实现了List接口。 线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 常见的线性表

    2024年02月11日
    浏览(28)
  • 【数据结构】线性表与顺序表

    ⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:浅谈数据结构 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 线性表(linear list) 是n个具有相同特性的数据元素的有限序列。 它是一种在实际中广泛使用的数据结构,常见的线性表:顺序表

    2024年02月07日
    浏览(34)
  • 数据结构 模拟实现ArrayList顺序表

    目录 一、顺序表中的接口 二、顺序表中的方法实现 (1)display方法 (2)add方法 1、不指定下标位置插入 2、指定下标位置插入 (3)contains方法 (4)indexOf方法 (5)get方法 (6)set方法 (7)remove方法 (8)size方法 (9)clear方法 三、最终代码 代码如下: 以上的方法就是我们

    2024年02月04日
    浏览(36)
  • 【数据结构】从顺序表到ArrayList类

    线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列… 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,

    2024年01月24日
    浏览(35)
  • 【数据结构与算法分析】反转链表与顺序表(内含源码,思路清晰)

      顺序表和链表都是数据结构中常见的线性表。它们的主要区别在于 内存管理方式不同 。   顺序表(Array)是由一系列元素按照一定顺序依次排列而成,它使用连续的内存空间存储数据。顺序表使用一个数组来存储数据,数组中的每个元素都可以通过下标来访问。顺序

    2024年02月07日
    浏览(84)
  • 【数据结构与算法】之8道顺序表与链表典型编程题心决!

                                                                                    个人主页:秋风起,再归来~                                                                                             数据结构与算

    2024年04月14日
    浏览(31)
  • 【数据结构与算法】顺序表与链表(单链表和双链表)超详解图示与源码。

                                                       大家好,今天我们来学习数据结构中的顺序表与链表!源码在最后附上 首先我们先来认识一下 顺序表 :                                       **如上图所示:很多人会以为数组就是顺序表,顺序表就是数组,这

    2024年02月21日
    浏览(35)
  • 【Java--数据结构】模拟实现ArrayList

    欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 目录 LIst 顺序表ArrayList 顺序表优点 IList接口 ArrayList中定义要操作的数组 在MyArrayList中 重写接口方法 新增元素 在指定位置插入元素  pos不合法异常 判断和查找元素 获取和更新元素 删除元素和清空顺序

    2024年04月25日
    浏览(26)
  • Java 中数据结构ArrayList的用法

    ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。 ArrayList 继承了 AbstractList ,并实现了 List 接口。 add() 将元素插入到指定位置的 arraylist 中 addAll() 添加集合中的所有元素到 arraylist 中 clear() 删除 arraylist 中的所

    2024年02月10日
    浏览(33)
  • 探索Java集合框架—数据结构、ArrayList集合

    Java集合的使用相信大家都已经非常得心应手,但是我们怎么做到知其然,更知其所以然这种出神入化的境界呢?我们揭开集合框架底层神秘面纱来一探究竟 目录 一、背景介绍 二、思路方案 数据结构是什么? 数据结构可以分为线性和非线性两种数据结构 线性数据结构: 非

    2024年02月10日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包