ArrayList与顺序表

1. ArrayList简介

2. ArrayList使用

3.ArrayList的扩容机制

4.Arraylist的遍历:

5. ArrayList的模拟实现

新增元素,默认在数组最后新增 add

打印顺序表

在 pos 位置新增元素

判定是否包含某个元素查找某个元素对应的位置contains

查找某个元素对应的位置indexOf

获取 pos 位置的元素 get

给 pos 位置的元素设为 value

删除第一次出现的关键字key——remove

获取顺序表长度

6.应用

扑克牌

杨辉三角形


1. ArrayList简介

在集合框架中, ArrayList 是一个普通的类,实现了 List 接口。

2. ArrayList使用

// 构造一个空的列表
List<Integer> list1 = new ArrayList<>();//接口引用对象

// 构造一个具有10个容量的列表
 List<Integer> list2 = new ArrayList<>(10);

3.ArrayList的扩容机制

  1. ArrayList是一个动态类型的顺序表,顺序表底层是一个数组,即:在插入元素的过程中会自动扩容:检测是否真正需要扩容,如果是调用grow准备扩容
  2.  预估需要库容的大小
  • 初步预估按照1.5倍大小扩容
  • 如果用户所需大小超过预估1.5倍大小,则按照用户所需大小扩容
  • 真正扩容之前检测是否能扩容成功,防止太大导致扩容失败

   3. 使用copyOf进行扩容

4.Arraylist的遍历:

  public static void main(String[] args) {
        ArrayList<Integer> list=new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        System.out.println(list);//直接打印
        for (int i = 0; i < list.size(); i++) {//for循环
            System.out.print(list.get(i));//get获取下标index元素
        }
            for (Integer x: list) {//for-each方法
                System.out.print(x);
            }
        }

5. ArrayList的模拟实现

class MyArraylist {//顺序表
    public int[] elem;//底层是一个数组
    public int usedSize;//标记数组当中有效变量有几个

    public MyArraylist() {//构造方法
        this.elem = new int[5];//分配内存
    }
  • 新增元素,默认在数组最后新增 add

  //一、新增元素,默认在数组最后新增
    public void add(int data) {
        //1.判断是不是满的
        if (isFull()) {
            //2.如果是满的就进行扩容
            this.elem = copyOf(this.elem, 2 * this.elem.length);//给这个数组扩容2倍,重新赋给elem
        }
        this.elem[this.usedSize] = data;//将data元素放到usedSize位置
        usedSize++;
    }

    public boolean isFull() {//判断你的数组是不是满的,是否可以存放数据
        if (this.usedSize == this.elem.length) {
            return true;//满的
        }
        return false;
    }
  • 打印顺序表

  //二、打印顺序表
    public void MyToString() {
        for (int i = 0; i < this.usedSize; i++) {
            System.out.print(this.elem[i] + " ");
        }
    }
  •   在 pos 位置新增元素

 //三、在 pos 位置新增元素
    public void add(int pos, int data) {
        //0.对pos位置进行判断
        if (pos < 0 || pos > this.usedSize) {
            System.out.println("pos位置不合法");
            return;
        }
        //1.判断是不是满的
        if (isFull()) {
            //2.如果是满的就进行扩容
            this.elem = copyOf(this.elem, 2 * this.elem.length);//给这个数组扩容2倍,重新赋给elem
        }
        //2.插入
        for (int i = usedSize - 1; i >= pos; i--) {
            this.elem[i + 1] = this.elem[i];
        }
        this.elem[pos] = data;
        this.usedSize++;
    }
  • 判定是否包含某个元素查找某个元素对应的位置contains


    //四、判定是否包含某个元素
    public boolean contains(int toFind) {
        for (int i = 0; i < this.usedSize; i++) {
            if (toFind == this.elem[i]) {
                return true;
            }
        }
        return false;
    }
  • 查找某个元素对应的位置indexOf

 //五、查找某个元素对应的位置
    public int indexOf(int toFind) {
        for (int i = 0; i < this.usedSize; i++) {
            if (this.elem[i]==toFind){
                return i;
            }
        }
        return -1;
    }
  • 获取 pos 位置的元素 get

   //六、获取 pos 位置的元素
    public int get(int pos) {
        if (pos<0||pos>=this.usedSize){//判断pos位置
            System.out.println("pos位置不合法");
            throw new RuntimeException("pos位置不合法");//需要抛异常,自定义异常
        }
      return this.elem[pos];
    }
  • 给 pos 位置的元素设为 value

//七、给 pos 位置的元素设为 value
    public void set(int pos, int value) {
        if (pos<0||pos>=this.usedSize){//判断pos位置
            System.out.println("pos位置不合法");
        }
        value=this.elem[pos];//覆盖原来的值
        }
  • 删除第一次出现的关键字key——remove

 //九、删除第一次出现的关键字key
    public void remove(int key) {
        if (isEmpty()){
            System.out.println("空的");
            return;
        }
        int index=indexOf(key);
        for (int i =index; i<this.usedSize-1; i++) {
                this.elem[i] =this.elem[i+1];
            }
        this.usedSize--;
//        this.elem[this.usedSize]=null;如果是引用数据类型一定要置为空
        }
        public boolean isEmpty(){
        if(this.usedSize==0){
            return true;
        }
        return false;
        }
    }
  • 获取顺序表长度

    // 八、获取顺序表长度
    public int size() {
        return this.usedSize;
    }
  
 // 十、清空顺序表
    public void clear() {
        this.usedSize=0;
        /*for (int i = 0; i < this.usedSize; i++) {如果是引用类型,需要置为null;
            this.elem[i]=null;//一个对象要被回收,必须是没有人再引用他了,置为null
            this.usedSize=0;*/
        }
}
public class ArraylistDome {
    public static void main(String[] args) {
        MyArraylist myArraylist = new MyArraylist();
        myArraylist.add(1);
        myArraylist.add(2);
        myArraylist.add(3);
        myArraylist.add(4);
        myArraylist.add(5);
        myArraylist.add(6);
        myArraylist.MyToString();//1
        myArraylist.add(0, 70);//2
        myArraylist.MyToString();
        System.out.println(myArraylist.contains(3));//3
        System.out.println(myArraylist.indexOf(70));//4
      System.out.println(myArraylist.get(2));
    try{
        System.out.println(myArraylist.get(10));
       }catch (RuntimeException e){
           e.printStackTrace();
        }
        System.out.println("kkkkk");
        myArraylist.get(2);
        myArraylist.remove(4);
     myArraylist.MyToString();
    }
    }

6.应用

  • 扑克牌

import java.util.*;

class CardDome {//找对象 创建对象 使用对象
    private int rank;//牌面值
    private String suit;//花色

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

    @Override
    public String toString() {
        return "花色" + suit + "数字" + rank;
    }
}

public class SomeCard {
    private static final String[] SUITS = {"♥", "♠", "♦", "♣",};//花色都是不变的,定义为常量

    public static ArrayList<CardDome> buyCard() {//买牌 返回值ArrayList<CardDome>
        ArrayList<CardDome> cards = new ArrayList<>();//52张牌用Arraylist存放,

        for (int i = 0; i < 4; i++) {//4种花色
            for (int j = 1; j <= 13; j++) {//一次抽取13张牌
                String suit = SUITS[i];//实例化对象第一个有花色
                int rank = j;//牌数
                CardDome card=new CardDome(rank, suit);
                cards.add(card);//每张牌都放在cards中
                //cards.add(new Card(SUITS[i],j);
            }
        }
        return cards;
    }

    public static void shuffle( ArrayList<CardDome> cards){//洗牌,洗上面那副牌
        Random random=new Random();

        for (int i = cards.size()-1; i >0 ; i--) {
            int index=random.nextInt(i);//生成一个随机数
            CardDome tmp=cards.get(i);//get获取i下标的值
            cards.set(i,cards.get(index));//获取到Index的值;set:将获取的值放到i下标
            cards.set(index,tmp);//设置index的值等于tmp
        }
    }


    public static void main(String[] args) {
        ArrayList<CardDome> cardlist=buyCard();//接收buyCard方法
        System.out.println(cardlist);

        shuffle(cardlist);
        System.out.println("洗牌" + cardlist);


        System.out.println("揭牌 ");
        ArrayList<ArrayList<CardDome>> hands=new ArrayList();//hands是ArrayList<CardDome>,再放到ArrayList中

        ArrayList<CardDome> hand1=new ArrayList<>();
        ArrayList<CardDome> hand2=new ArrayList<>();
        ArrayList<CardDome> hand3=new ArrayList<>();

        hands.add(hand1);
        hands.add(hand2);
        hands.add(hand3);

        for (int i = 0; i < 5; i++) {//5轮揭牌

            for (int j = 0; j < 3; j++) {//3个人
                CardDome card=cardlist.remove(0);//每次都揭走0下标的牌,删除
                hands.get(j).add(card);//j为0是第一个人揭牌,add一张牌
            }
        }
        System.out.println("第1个人的牌"+hand1);
        System.out.println("第2个人的牌"+hand2);
        System.out.println("第3个人的牌"+hand3);
        System.out.println("剩下的牌"+cardlist);
    }
}
  • 杨辉三角形

import java.util.*;

 class Test {
     public static List<List<Integer>> generate(int numRows) {
         List<List<Integer>> ret = new ArrayList<>();//总的数据

         List<Integer> list = new ArrayList<>();//第一行
         list.add(1);
         ret.add(list);//拿到第一行

         for (int i = 1; i < numRows; i++) {
             List<Integer> curRow = new ArrayList<>();//当前行
             curRow.add(1);
             for (int j = 1; j < i; j++) {
                 List<Integer> perRow = ret.get(i - 1);//拿到上一行
                 int val = perRow.get(j) + perRow.get(j - 1);
                 curRow.add(val);
             }
             curRow.add(1);//最后一个数字
             ret.add(curRow);
         }
         return ret;
     }

     public static void main(String[] args) {
         List<List<Integer>> triangle = generate(5);
         System.out.println(triangle);
     }
 }



//结果:[[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1]]
i

三角形

1list
11curRow
2121
         j12

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值