数据结构---顺序表

文章目录

  • 线性表
  • 顺序表的使用及其内部方法
  • ArrayList 的扩容机制
  • 顺序表的几种遍历方式
  • 顺序表的优缺点
  • 顺序表的模拟实现
  • 杨辉三角
  • 扑克牌算法

线性表

  线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列…

  线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储
在这里插入图片描述


顺序表的使用及其内部方法

  顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表

ArrayList的使用
ArrayList 的构造方法如下:
在这里插入图片描述
示例代码如下:

public static void main(String[] args) {
// ArrayList创建,推荐写法
List<Integer> list1 = new ArrayList<>();
// 构造一个具有10个容量的列表
List<Integer> list2 = new ArrayList<>(10);
list2.add(1);
list2.add(2);
list2.add(3);
// list2.add("hello"); // 编译失败,List<Integer>已经限定了,list2中只能存储整形元素
// list3构造好之后,与list中的元素一致
ArrayList<Integer> list3 = new ArrayList<>(list2);
// 避免省略类型,否则:任意类型的元素都可以存放,使用时将是一场灾难
List list4 = new ArrayList();
list4.add("111");
list4.add(100);
}

ArrayList 中的方法
在这里插入图片描述


ArrayList 的扩容机制

ArrayList是一个动态类型的顺序表,即:在插入元素的过程中会自动扩容。

【总结】

  1. 默认容量为10
  2. 检测是否真正需要扩容,如果是调用grow准备扩容
  3. 预估需要扩容的大小
  • 初步预估按照1.5倍大小扩容
  • 如果用户所需大小超过预估1.5倍大小,则按照用户所需大小扩容
  • 真正扩容之前检测是否能扩容成功,防止太大导致扩容失败
  1. 使用copyOf进行扩容

顺序表的几种遍历方式

 public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);System.out.println(list);System.out.println("=========for循环遍历=========");for (int i = 0; i < list.size(); i++) {System.out.print(list.get(i) +" ");}System.out.println();System.out.println("=========foreach循环遍历=========");for(Integer x : list) {System.out.print(x +" ");}System.out.println();System.out.println("=========迭代器遍历1=========");Iterator<Integer> it = list.iterator();while(it.hasNext()) {System.out.print(it.next() +" ");}System.out.println();System.out.println("=========迭代器遍历2=========");ListIterator<Integer> tmpList = list.listIterator();while(tmpList.hasNext()) {System.out.print(tmpList.next() +" ");}System.out.println();System.out.println("=========迭代器遍历3=========");ListIterator<Integer> tmpList2 = list.listIterator(list.size());while(tmpList2.hasPrevious()) {System.out.print(tmpList2.previous() +" ");}System.out.println();}

顺序表的优缺点

优点:

  • 内存连续—>物理上和逻辑上
  • 根据下标查找元素,时间复杂度为O(1)

缺点:

  • 插入数据和删除数据不合适,因为每次都要移动元素
  • 时间复杂度会达到O(N)

顺序表的模拟实现

  顺序表的底层使用数组实现的,所以这里模拟实现顺序表也使用数组来实现。
在实现之前,先看看ArrayList中的常用方法,后续要模拟实现这些方法,如下:

public class IList {
// 新增元素,默认在数组最后新增
public void add(int data) { }
// 在 pos 位置新增元素
public void add(int pos, int data) { }
// 判定是否包含某个元素
public boolean contains(int toFind) { return true; }
// 查找某个元素对应的位置
public int indexOf(int toFind) { return -1; }
// 获取 pos 位置的元素
public int get(int pos) { return -1; }
// 给 pos 位置的元素设为 value
public void set(int pos, int value) { }
//删除第一次出现的关键字key
public void remove(int toRemove) { }
// 获取顺序表长度
public int size() { return 0; }
// 清空顺序表
public void clear() { }
// 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
public void display() { }
}

【思路】:把这些ArrayList中的方法放入一个接口中(当然这些方法放入接口中暂时没有具体实现,为抽象方法),让模拟实现的MyArrayList 类实现这个接口,然后在MyArrayList 类中把这些方法全部重写并实现。


创建一个 IList 接口,接口中包含各种关于ArrayList的抽象方法,代码示例如下:

public interface IList {// 新增元素,默认在数组最后新增void add(int data);// 在 pos 位置新增元素void add(int pos, int data);// 判定是否包含某个元素boolean contains(int toFind);// 查找某个元素对应的位置int indexOf(int toFind) ;//// 获取 pos 位置的元素int get(int pos);// 给 pos 位置的元素设为 valuevoid set(int pos, int value);//删除第一次出现的关键字keyvoid remove(int toRemove);// 获取顺序表长度int size();// 清空顺序表void clear();// 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的void display();//判断数组是否为空boolean isEmpty();//删除所有数据为toRemove的元素void removeAll(int toRemove);
}

创建MyArrayList 类 使其实现 IList 接口,在类中重写接口中的方法

import java.util.Arrays;
public class MyArrayList implements IList{public int[] elem;public int usedSize;public MyArrayList() {this.elem = new int[10];}//判断数组是否满了public boolean isFull() {return elem.length == usedSize;}//数组满了,进行扩容private void grow() {elem = Arrays.copyOf(elem,2*elem.length);}/*** 对数组的 最后一个位置 新增data* @param data*/@Overridepublic void add(int data) {if(isFull()) {grow();}elem[usedSize] = data;usedSize++;}/*** 在pos位置 新增 元素data* @param pos* @param data*/@Overridepublic void add(int pos, int data) {if(isFull()) {grow();}if(pos < 0 || pos > usedSize) {throw new PosOutOfException("pos位置不合法");}for (int i = usedSize-1; i >= pos; i--) {elem[i+1] = elem[i];}elem[pos] = data;usedSize++;}/*** 查找一个数据,返回true或false* @param toFind* @return*/@Overridepublic boolean contains(int toFind) {if(isEmpty()) {return false;}for (int i = 0; i < usedSize; i++) {if(elem[i] == toFind) {return true;}}return false;}/*** 查找一个数据,返回其下标* @param toFind* @return*/@Overridepublic int indexOf(int toFind) {for (int i = 0; i < usedSize; i++) {if(elem[i] == toFind) {return i;}}return -1;}/*** 查找下标为pos的元素,返回其数值* @param pos* @return*/@Overridepublic int get(int pos) {if(isEmpty()) {throw new EmptyArrayListException("顺序表为空");}if(pos < 0 || pos >= usedSize) {throw new RuntimeException("pos位置不合法");}return elem[pos];}/*** pos位置 设置成 value* @param pos* @param value*/@Overridepublic void set(int pos, int value) {if(pos < 0 || pos >= usedSize) {throw new PosOutOfException("pos位置不合法");}elem[pos] = value;}/*** 删除数组中的一个元素 toMove* @param toRemove*/@Overridepublic void remove(int toRemove) {int index = indexOf(toRemove);if(index == -1) {return;}for (int i = index; i < usedSize-1; i++) {elem[i] = elem[i+1];}usedSize--;}@Overridepublic int size() {return usedSize;}@Overridepublic void clear() {usedSize = 0;}@Overridepublic void display() {for (int i = 0; i < usedSize; i++) {System.out.print(elem[i] +" ");}System.out.println();}@Overridepublic boolean isEmpty() {if(usedSize == 0) {return true;}return false;}@Overridepublic void removeAll(int toRemove) {while(contains(toRemove)) {int index = indexOf(toRemove);for (int i = index; i < usedSize-1; i++) {elem[i] = elem[i+1];}usedSize--;}}
}

测试类Test

    public static void main1(String[] args) {MyArrayList myArrayList = new MyArrayList();myArrayList.add(1);myArrayList.add(2);myArrayList.add(3);myArrayList.add(1,19);myArrayList.display();myArrayList.set(0,100);myArrayList.display();boolean ret = myArrayList.contains(100);System.out.println(ret);myArrayList.set(1,33);myArrayList.display();myArrayList.add(0,1);myArrayList.add(1,2);myArrayList.add(2,1);myArrayList.add(3,4);myArrayList.add(4,1);myArrayList.display();myArrayList.removeAll(1);myArrayList.display();}

杨辉三角

OJ链接—> 杨辉三角
在这里插入图片描述在这里插入图片描述

题目描述:给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。
示例:
输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
要求:返回值用 List<List < Integer > > 接收

  思路:要求每行数值都放入一个List< Integer > 中,所以遍历每行,每遍历一行,就创建一个 List< Integer > ,然后把每行的数值add进顺序表,完成每行 List< Integer > 的元素填充,最后再把本行的 List< Integer > 作为元素放入 List<List < Integer > > 中。
  那么问题是 如何得到每行的数字,将其放入顺序表中?—>观察杨辉三角,每行的第一个元素和最后一个元素都为 1 ,中间的元素:如果中间某一个元素是 i 行 j 列,那么 这个元素值就等于上一行 本列和前一列 的两值之和: [i] [j] = [i-1] [j] + [i-1] [j-1],但是这不是数组不能使用下标直接赋值,所以可以使用顺序表的 get(int Index) 和 set(int Index) 方法,分别拿到上一行,取出上一行的 j下标 和 j-1 下标的元素,两值相加赋值给 本行的顺序表list。

完整代码如下:

class Solution {public List<List<Integer>> generate(int numRows) {List<List<Integer>> lists = new ArrayList<>();//第一行List<Integer> list1 = new ArrayList<>();list1.add(1);lists.add(list1);for(int i = 1; i < numRows; i++) {List<Integer> list = new ArrayList<>();//第一个元素list.add(1);//中间元素List<Integer> prevRow = lists.get(i-1);//拿到上一行for(int j = 1; j < i; j++) {list.add(prevRow.get(j) + prevRow.get(j-1));}//最后一个元素list.add(1);lists.add(list);}return lists;}
}

扑克牌算法

实现效果:能够完成创建扑克牌、洗牌、发牌操作
思路:
完成洗牌和发牌操作,需要先拿到一副扑克牌,所以先创建一副扑克牌(共52张牌,没有大小王)
一副扑克牌由 13张红桃♥、13张黑桃♠、13张方片♦、13张梅花♣ 组成。
创建 Card类,内部定义变量 suit 花色、rank 数字,重写toString方法,便于观察每张牌的信息
创建 Game类,内部实现 创建一副牌、洗牌、发牌操作.
Card类的代码示例如下:

public class Card {public String suit;//花色--红桃、黑桃、方块、梅花public int rank;//数字public Card(String suit, int rank) {this.suit = suit;this.rank = rank;}@Overridepublic String toString() {
//        return "Card{" +
//                "suit='" + suit + '\'' +
//                ", rank=" + rank +
//                '}';return "{ "+suit+rank+" }";}
}

1.创建一副牌,使用顺序表作为容器,将每一张牌放入这个容器中
如何把每一张牌放入顺序表中?–> 四种不同花色分别有13张牌,所以使用两个 for 循环,将卡牌放入顺序表
内部循环13次,把放入同一花色的13张牌放入顺序表,外部循环4次,每次都是不同的花色。代码示例如下:

import java.util.ArrayList;
import java.util.List;
import java.util.Random;public class Game {public String[] suits = {"♥","♠","♦","♣"};public List<Card> cardsList = new ArrayList<>();//作为扑克牌的容器//创建一副扑克牌public List<Card> createCards() {for (int i = 0; i < suits.length; i++) {for (int j = 1; j <= 13 ; j++) {Card card = new Card(suits[i],j);cardsList.add(card);}}return cardsList;}

2.洗牌操作,现实中洗牌是将任意不同的卡牌交换位置,转换为代码层面,可以把任意不同下标的卡牌进行交换,for(i)循环遍历顺序表,每次生成一个i下标后面的随机数(i+1,51),但是这样生成随机数的实现比较麻烦,因此可以从最后面即下标为 51 的位置向前遍历顺序表,每次生成 [0,i) 的随机数,然后交换下标为i 和 下标为randIndex的元素。 代码示例如下:

    //洗牌操作public void shuffle(List<Card> cardsList) {Random random = new Random();for (int i = 51; i > 0; i--) {int randIndex = random.nextInt(i);//生成 [0,i-1] 区间的随机数//i下标位置 与 randIndex下标位置元素进行交换swap(i,randIndex);}}//i下标位置 与 randIndex下标位置元素进行交换private void swap(int i,int randIndex) {Card tmp = cardsList.get(i);cardsList.set(i,cardsList.get(randIndex));cardsList.set(randIndex,tmp);}

3.发牌操作
要求:三人依次取牌,每人每次取牌一张,进行五次轮回取牌,最终每人手中有五张牌
三个人取出的牌,也需要一个容器容纳扑克牌,可以为每个人创建一个顺序表容纳取出的扑克牌
三人依次取牌,每次一张,进行五次轮回,就可以使用两个for循环,完成取牌和牌进入入顺序表的操作
每次取牌都要把取出的这张牌从顺序表中删除,避免其他人重复取这张牌(现实中也是如此,取出一张牌,那么这张牌就不会存在于 待取的那摊扑克牌中,谁取的这张牌,这张牌就在谁手上),转换为代码层面,就是调用 cardsList.remove(0)方法。将cardsList.remove(0)方法的返回值 传给 每个人的手中

【注意】这里cardsList.remove(0)方法中的参数一直都是0,因为每次取牌都是最上面的牌,而顺序表删除已取出的牌之后,第二张牌又会称为新的下标为 0 的新的元素。
代码示例如下:

//发牌,三个人轮流取牌,一次取一张,最终每个人五张牌public List<List<Card>> play(List<Card> cardsList) {List<List<Card>> cardLists = new ArrayList<>();List<Card> hand0 = new ArrayList<>();List<Card> hand1 = new ArrayList<>();List<Card> hand2 = new ArrayList<>();cardLists.add(hand0);cardLists.add(hand1);cardLists.add(hand2);for (int i = 0; i < 5; i++) {for (int j = 0; j < 3; j++) {Card card = cardsList.remove(0);cardLists.get(j).add(card);}}return cardLists;}

Test测试类,代码示例如下:

import java.util.List;public class Test {public static void main(String[] args) {Game game = new Game();List<Card> cardsList = game.createCards();System.out.println("初始牌:"+cardsList);game.shuffle(cardsList);System.out.println("洗过后的牌:"+cardsList);System.out.println("发牌后,每人手中的牌:"+game.play(cardsList));}
}

运行结果:

“C:\Program Files\Java\jdk-17\bin\java.exe” “-javaagent:D:\softstall\idea\IntelliJ IDEA Community Edition 2021.3.3\lib\idea_rt.jar=63623:D:\softstall\idea\IntelliJ IDEA Community Edition 2021.3.3\bin” -Dfile.encoding=UTF-8 -classpath D:\javacode\J20241025_CardGame\out\production\J20241025_CardGame Test
初始牌:[{ ♥1 }, { ♥2 }, { ♥3 }, { ♥4 }, { ♥5 }, { ♥6 }, { ♥7 }, { ♥8 }, { ♥9 }, { ♥10 }, { ♥11 }, { ♥12 }, { ♥13 }, { ♠1 }, { ♠2 }, { ♠3 }, { ♠4 }, { ♠5 }, { ♠6 }, { ♠7 }, { ♠8 }, { ♠9 }, { ♠10 }, { ♠11 }, { ♠12 }, { ♠13 }, { ♦1 }, { ♦2 }, { ♦3 }, { ♦4 }, { ♦5 }, { ♦6 }, { ♦7 }, { ♦8 }, { ♦9 }, { ♦10 }, { ♦11 }, { ♦12 }, { ♦13 }, { ♣1 }, { ♣2 }, { ♣3 }, { ♣4 }, { ♣5 }, { ♣6 }, { ♣7 }, { ♣8 }, { ♣9 }, { ♣10 }, { ♣11 }, { ♣12 }, { ♣13 }]
洗过后的牌:[{ ♣13 }, { ♥13 }, { ♠5 }, { ♦10 }, { ♠13 }, { ♦12 }, { ♥4 }, { ♦6 }, { ♣5 }, { ♣3 }, { ♣1 }, { ♠12 }, { ♣11 }, { ♣2 }, { ♣7 }, { ♥5 }, { ♦9 }, { ♥11 }, { ♥2 }, { ♦2 }, { ♥7 }, { ♦5 }, { ♣12 }, { ♠7 }, { ♠11 }, { ♦11 }, { ♥1 }, { ♠8 }, { ♥10 }, { ♣8 }, { ♥8 }, { ♥3 }, { ♠4 }, { ♣10 }, { ♦4 }, { ♠2 }, { ♠1 }, { ♥9 }, { ♠3 }, { ♣6 }, { ♠6 }, { ♦7 }, { ♥12 }, { ♦8 }, { ♣4 }, { ♠10 }, { ♦13 }, { ♠9 }, { ♦1 }, { ♣9 }, { ♥6 }, { ♦3 }]
发牌后,每人手中的牌:[[{ ♣13 }, { ♦10 }, { ♥4 }, { ♣3 }, { ♣11 }], [{ ♥13 }, { ♠13 }, { ♦6 }, { ♣1 }, { ♣2 }], [{ ♠5 }, { ♦12 }, { ♣5 }, { ♠12 }, { ♣7 }]]


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/460432.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大模型,多模态大模型面试【LoRA,分类,动静态数据类型,DDPM,ControlNet,IP-Adapter, Stable Diffusion】

大模型&#xff0c;多模态大模型面试【LoRA&#xff0c;分类&#xff0c;动静态数据类型&#xff0c;DDPM&#xff0c;ControlNet&#xff0c;IP-Adapter, Stable Diffusion】 问题一&#xff1a;LoRA是用在节省资源的场景下&#xff0c;那么LoRA具体是节省了内存带宽还是显存呢…

【力扣刷题实战】相同的树

大家好&#xff0c;我是小卡皮巴拉 文章目录 目录 力扣题目&#xff1a; 相同的树 题目描述 示例 1&#xff1a; 示例 2&#xff1a; 示例 3&#xff1a; 解题思路 题目理解 算法选择 具体思路 解题要点 完整代码&#xff08;C语言&#xff09; 兄弟们共勉 &#…

2024年AI绘画与写作工具排行榜:提升创作效率必备利器推荐

2024年&#xff0c;AI绘画和写作工具迎来全新突破&#xff0c;从艺术创作到内容写作&#xff0c;越来越多的创作者开始依赖AI工具来提升效率、拓展创意。而随着市场上AI工具的增多&#xff0c;如何选择适合的工具变得尤为重要。今天为大家推荐一些提升创作效率的AI绘画和写作利…

沈阳乐晟睿浩科技有限公司抖音小店新篇章

在当今数字化时代&#xff0c;电商行业如雨后春笋般迅速崛起&#xff0c;其中抖音小店凭借其庞大的用户基础、精准的推荐算法和便捷的购物体验&#xff0c;成为了电商领域的新宠。在这场电商变革中&#xff0c;沈阳乐晟睿浩科技有限公司&#xff08;以下简称“乐晟睿浩”&#…

SQL语言基础

SQL(Struct Query Language)是结构化查询语言的简称&#xff0c;是一种在关系型数据库中定义和操纵数据的标准语言。 不要使用面向对象的思想学习SQL&#xff0c;因为它不是面向对象的语言目标 SQL语言简介(了解)从数据库数据检索数据(重点)子查询(重点)Oracle常用函数(掌握) …

VBox增强功能、VBoxLinuxAdditions安装、共享文件夹问题解决

VBox增强功能、VBoxLinuxAdditions安装、共享文件夹问题解决 文章目录 VBox增强功能、VBoxLinuxAdditions安装、共享文件夹问题解决1.VBoxLinuxAdditions.run&#xff1a;找不到命令解决方案 2.可以看到共享文件夹。但是不能看到里面的内容。解决方案 参考 共享文件夹设置&…

一、在cubemx下RTC配置调试实例测试

一、rtc的时钟有lse提供。 二、选择rtc唤醒与闹钟功能 内部参数介绍 闹钟配置 在配置时间时&#xff0c;注意将时间信息存储起来&#xff0c;防止复位后时间重新配置。 if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR0)! 0x55AA)//判断标志位是否配置过&#xff0c;没有则进…

MySQL 复合索引测试

对MySQL复合索引结合具体示例&#xff0c;各条件下索引使用情况的运行结果及分析。 目录 复合索引示例 创建表 新增数据 查询数据 选项A SQL查询 explain分析 选项B SQL查询 explain分析 选项C SQL查询 explain分析 选项D SQL查询 explain分析 选项E SQL查询…

JavaFx -- chapter05(多用户服务器)

chapter05(线程池-多用户服务器) 教学与实践目的 学会服务器支持多用户并发访问的程序设计技术。 多用户服务器是指服务器能同时支持多个用户并发访问服务器所提供的服务资源&#xff0c;如聊天服务、文件传输等。 第二讲的TCPServer是单用户版本&#xff0c;每次只能和一个…

初体验鸿蒙 HarmonyOS NEXT开发

上个星期三就下载了鸿蒙 HarmonyOS NEXT&#xff0c;安装好了后测试了一下&#xff0c;感觉界面和功能设计与IntelliJ IDEA很像&#xff0c;对初学者非常友好&#xff0c;所见即所得。不知道什么原因&#xff0c;写了代码后测试起来很慢&#xff0c;简单测试后就没有再动。 今天…

《DIY项目之“一只眼狗链”》:视频方案

项目背景 《DIY项目之“一只眼狗链”》合集主要记录完成一个DIY项目的所有过程。该合集预计更新频率为2~3周一篇&#xff08;同样属于一边做一边记录发布&#xff0c;时间上主要涉及PCB绘板、零部件采购、样品制作、编程等&#xff0c;存在一定的不可控性&#xff09;。 当前项…

Date工具类详细汇总-Date日期相关方法

# 1024程序员节 | 征文 # 目录 简介 Date工具类单元测试 Date工具类 简介 本文章是个人总结实际工作中常用到的Date工具类&#xff0c;主要包含Java-jdk8以下版本的Date相关使用方法&#xff0c;可以方便的在工作中灵活的应用&#xff0c;在个人工作期间频繁使用这些时间的格…

WPF拖拽交互全攻略及实现自定义拖拽控件及数据交换技巧解析

目录 1. 基本概念2 . 实现拖拽功能概述需要要实现基本的拖放&#xff0c;完成以下任务&#xff1a;其他操作 示例3.1 设置拖拽源&#xff0c;拖拽开始3.2 设置拖拽效果DragDropEffects 3.3 设置放置目标&#xff0c;处理拖拽数据拖拽输入DragEnter事件DragOver事件拖拽离开Drag…

ubuntu 22.04网线连接无ip、网络设置无有线网界面(netplan修复)

目前遇到过树莓派和其他设备安装 ubuntu22.04&#xff0c; 使用有线网络一段时间&#xff08;可能有其他软件安装导致&#xff09;造成有线网络未启动无ip分配的问题。 1、动态分配 通过命令行启动dhcpclient实现 网络eth0存在异常&#xff0c;网口灯电源和信号灯均点亮&am…

开关灯问题(c语言)

样例&#xff1a;10 10 &#xff0c;输出&#xff1a;1&#xff0c;4&#xff0c;9 5 5 &#xff0c;输出&#xff1a;1&#xff0c;4 代码如下 #include<stdio.h> //引入bool值的概念 #include<stdbool.h> int main() {int n 0;//n为灯的数量int m 0;…

【Android14 ShellTransitions】(八)播放动画

书接上回&#xff0c;话说当WMCore部分走到了Transition.onTransactionReady&#xff0c;计算完参与动画的目标&#xff0c;构建出TransitionInfo后&#xff0c;接下来就把这个包含了动画参与者的TransitionInfo发给了WMShell&#xff0c;然后就该播放动画了&#xff0c;这部分…

git快速合并代码dev->master

需求&#xff1a; 日常开发都是在dev分支进行开发&#xff0c;但是dev代码开发测试完成后&#xff0c;需要将dev代码合到master主分支上 开始合并代码&#xff1a; 一、场景 一个代码仓库&#xff0c;包含两个分支&#xff0c;一个是master&#xff0c;另一个是dev&#xff1b…

gitblit 学习-hook功能

hook功能 hook是什么 git hooks是git提供的&#xff0c;在发生特定事件时&#xff0c;允许用户添加自定义代码&#xff08;或操作&#xff09;的方式。 就像Vue中组件的生命周期钩子&#xff0c;比如&#xff0c;你想在vue组件创建后输出一行log, 你可能会这么写 有什么用&a…

Android Input的流程和原理

Android Input事件机制 Android系统是由事件驱动的&#xff0c;而Input是最常见的事件之一&#xff0c;用户的点击、滑动、长按等操作&#xff0c;都属于Input事件驱动&#xff0c;其中的核心就是InputReader和InputDispatcher。InputReader和InputDispatcher是跑在system_serv…

Jmeter基础篇(19)JSR223预处理器

前言 JSR223预处理器是Apache JMeter中的一个组件&#xff0c;它允许用户使用任何支持Java Scripting API (JSR 223) 的脚本语言来执行预处理任务。这个功能非常强大&#xff0c;因为它让测试人员能够利用如Groovy、JavaScript&#xff08;Nashorn引擎&#xff09;、BeanShell…