当前位置: 首页 > news >正文

Java--ArrayList(数据结构顺序表)

前言:

        Java中有线性表存储上数据,线性表分为:顺序表和链表(ArrayList、LinkedList)。

        当然Java中也会模拟实现一遍顺序表(ArrayList),包括里面的所有的方法

        但是我的重心会放在对Java中自带的ArrayList中方法的使用,以及如何测试一些题目是否正确!

ArrayList的模拟实现:

创建自己的接口:

        我们知道不论是顺序表还是链表都扩展了List接口,之后再顺序表或者链表中重写接口中的方法!

        首先我们可以先看看Java中ArrayList的源代码:

        

1、Java中的ArrayList用的是泛型类(因为我们不知道该顺序表不知道要存放什么类型的数据!)

2、 接口和父类的继承Java中做的比较全面,我们只需要模仿List接口即可。

我们做到以上两点即可。

MyList接口如下:

public interface MyList<T> {public void display();// 新增元素,默认在数组最后新增public void add(T data);/*** 判断当前的顺序表是不是满的!* @return true:满   false代表空*/public boolean isFull();public boolean checkPosInAdd(int pos);// 判定是否包含某个元素public boolean contains(T toFind);// 查找某个元素对应的位置public int indexOf(T toFind);// 获取 pos 位置的元素public int get(int pos);public boolean isEmpty();// 给 pos 位置的元素设为【更新为】 valuepublic void set(int pos, T val);/*** 删除第一次出现的关键字key* @param key*/public void remove(T key) ;// 获取顺序表长度public int size() ;// 清空顺序表public void clear() ;
}

创建自己的MyArrayList:

        

public class MyArrayList<T> implements MyList<T>{private Object[] arrays;int size;private static final int DEFAULT_CAPACITY = 10;public MyArrayList() {super();arrays = new Object[DEFAULT_CAPACITY];size = 0;}@Overridepublic void display() {for(int i = 0;i<size;i++) {System.out.print(arrays[i]+" ");}System.out.println();}@Overridepublic void add(T data) {//第一步检查是否需要扩容if(isFull()) {Object[] newArrays = new Object[size+size>>1];//1.5倍扩容newArrays = Arrays.copyOf(arrays,size);arrays = newArrays;}arrays[size++] = data;}@Overridepublic boolean isFull() {if(size == arrays.length) {return true;}return false;}@Overridepublic boolean checkPosInAdd(int pos) {if(pos >= 0 && pos < arrays.length) {return true;}else {return false;}}@Overridepublic boolean contains(T toFind) {for(int i = 0;i<size;i++) {if(arrays[i].equals(toFind)) {return true;}}return false;}@Overridepublic int indexOf(T toFind) {for(int i = 0;i<size;i++) {if(arrays[i].equals(toFind)) {return i;}}return -1;}@Overridepublic T get(int pos) {if(pos<0 || pos>=size) {return null;}return (T)arrays[pos];}@Overridepublic boolean isEmpty() {if(size >0) return false;else return true;}@Overridepublic void set(int pos, T data) {if(isFull()) {Object[] newArrays = new Object[size+size>>1];//1.5倍扩容newArrays = Arrays.copyOf(arrays,size);arrays = newArrays;}arrays[pos] = data;}@Overridepublic void remove(T key) {int pos = indexOf(key);if(pos == -1) {return ;} else{for(int i = pos;i<size-1;i++) {arrays[i] = arrays[i-1];}}}@Overridepublic int size() {return size;}@Overridepublic void clear() {arrays = null;}
}

main方法中使用:

可以传不同的包装类:

Integer类:

public class Main {public static void main(String[] args) {MyArrayList<Integer> list = new MyArrayList<>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);list.add(7);list.set(2,9);System.out.println(list.contains(7));list.display();}
}

Character类:

    public static void main(String[] args) {MyArrayList<Character> list = new MyArrayList<>();list.add('a');list.add('b');list.add('c');list.add('d');list.add('e');list.display();}

大家写好可以自己去测!!                 

 洗牌算法:

规则:

        不算大小王,一共有52张牌,每种花色有12张,有三个人,需要摸牌。一共摸5轮,每轮每人摸一张。(注意52张牌需要打乱顺序)。

 创建Card类:

        我们应该先描述一张牌的特性:

public class Card {private int val;private String ch;public Card(int val, String ch) {this.val = val;this.ch = ch;}@Overridepublic String toString() {return ch+""+val;}
}

注意:

我在这里重写了toString方法,方便等会打印的时候打印对应的内容。

创建CardDemo类:

        里面包含了初始化52张牌,洗牌等操作:

public class CardDemo {public static final String[] SUITS = {"♠", "♥", "♣", "♦"};private static final int DEFAULT = 52;public static List<Card> buyCards() {List<Card> deck = new ArrayList<>(DEFAULT);for(int i = 0;i< 4;i++) {for (int j = 1; j <= 13; j++) {String tmp = SUITS[i];Card card = new Card(j,tmp);deck.add(card);}}return deck;}public static void swap(List<Card> deck,int cur,int tmp){Card card = deck.get(cur);deck.set(cur,deck.get(tmp));deck.set(tmp,card);}public static void randCards(List<Card> deck){Random r = new Random(100);for(int i = deck.size()-1;i>0;i--) {int tmp = r.nextInt(i);swap(deck,i,tmp);}}
}

测试类Main:

包括初始化牌,三个人轮流摸牌等操作:

public class Main {public static void main(String[] args) {List<Card> deck = CardDemo.buyCards();System.out.println("买回来牌");System.out.println(deck);System.out.println();CardDemo.randCards(deck);System.out.println("洗过的牌");System.out.println(deck);List<List<Card>> hands = new ArrayList<>();hands.add(new ArrayList<>());hands.add(new ArrayList<>());hands.add(new ArrayList<>());for(int i = 0;i<5;i++) {for (int j = 0; j <3 ; j++) {hands.get(j).add(deck.remove(0));}}System.out.println("剩余的牌:");System.out.println(deck);System.out.println("A 手中的牌:");System.out.println(hands.get(0));System.out.println("B 手中的牌:");System.out.println(hands.get(1));System.out.println("C 手中的牌:");System.out.println(hands.get(2));}
}

相关文章:

  • spring揭秘24-springmvc02-5个重要组件
  • 使用Python和OpenCV生成灰阶图像
  • mybatisplus code generator columnNaming 不起作用
  • 打靶记录18——narak
  • 基于冲突动态监测算法的健身房预约管理系统
  • k8s 部署ETCD ,并且使用.net core 连接获取配置
  • linux-CMake
  • MySQL进阶:深入理解数据约束与优化查询
  • Linux增加一个回收站功能(实用功能)
  • 算法复杂度之时间复杂度
  • PMA TB40-1 限温器Temperature limiter TB 40-1 手测
  • SpringBoot整合JPA实现CRUD详解
  • 【珠海一号卫星】
  • 鼎阳加油-IOC关键技术问题的解决记
  • 柯桥韩语学校|韩语每日一词打卡:회갑연[회가변]【名词】花甲宴
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 10个确保微服务与容器安全的最佳实践
  • Angular2开发踩坑系列-生产环境编译
  • Java读取Properties文件的六种方法
  • Linux中的硬链接与软链接
  • Octave 入门
  • React as a UI Runtime(五、列表)
  • RxJS: 简单入门
  • Tornado学习笔记(1)
  • vue 个人积累(使用工具,组件)
  • 包装类对象
  • 测试开发系类之接口自动化测试
  • 创建一个Struts2项目maven 方式
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 驱动程序原理
  • 智能合约开发环境搭建及Hello World合约
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 回归生活:清理微信公众号
  • # Panda3d 碰撞检测系统介绍
  • #### go map 底层结构 ####
  • $().each和$.each的区别
  • (4)Elastix图像配准:3D图像
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (力扣)循环队列的实现与详解(C语言)
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (七)c52学习之旅-中断
  • (算法)Game
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转载)CentOS查看系统信息|CentOS查看命令
  • (转载)Linux 多线程条件变量同步
  • (转载)OpenStack Hacker养成指南
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .Net Winform开发笔记(一)
  • .net 提取注释生成API文档 帮助文档
  • .NET应用UI框架DevExpress XAF v24.1 - 可用性进一步增强
  • .NET中GET与SET的用法
  • @GlobalLock注解作用与原理解析
  • @requestBody写与不写的情况