【数据结构】ArrayList的简单使用

ArrayList

上一次我们自己模拟实现了一下数据结构中的顺序表,当然在我们日常使用时不需要每次使用都自己模拟实现一遍,Java中提供了ArrayList类,我们直接导包就可以使用。

 public static void main(String[] args) {
        List<Integer> list1 = new ArrayList<>();//创建一个空表
        List<String> list2 = new ArrayList<>(10);//指定表的初始容量

        list1.add(1);
        list1.add(2);
        list1.add(3);
        list2.add("a");
        list2.add("b");
        list2.add("c");

        //打印顺序表
        for(int i = 0;i < list1.size();i++) {
            System.out.print(list1.get(i) + " ");
        }
        System.out.println();
        for (String str:list2) {
            System.out.print(str + " ");
        }

    }

我们可以实例化ArrayList对象,通过对象调用方法来操作顺序表。例如上面这段代码我们就实例化了两个顺序表,通过调用add()方法想顺序表中添加元素最后通过for循环遍历打印顺序表。ArrayList最长使用的遍历方式是:for循环+下标 以及 foreach
在这里插入图片描述

一些ArrayList常用的方法

方法功能
boolean add(E e)尾插 e
void add(int index, E element)将 e 插入到 index 位置
boolean addAll(Collection<? extends E> c)尾插 c 中的元素
E remove(int index)删除 index 位置元素
boolean remove(Object o)删除遇到的第一个 o
E get(int index)获取下标 index 位置元素
E set(int index, E element)将下标 index 位置元素设置为 element
void clear()清空
boolean contains(Object o)判断 o 是否在线性表中
int indexOf(Object o)返回第一个 o 所在下标
int lastIndexOf(Object o)返回最后一个 o 的下标
List<E> subList(int fromIndex, int toIndex)截取部分List=

杨辉三角

杨辉三角,这是一道leetcode上面的练习题,在了解上面的知识之后大家可以尝试做一做,我们需要通过顺序表实现杨辉三角。
在这里插入图片描述

class Solution {
    public List<List<Integer>> generate(int numRows) {

    }
}

这是题目已经给出的代码,有的老铁就要昏倒了,题目差一点就没看懂,List<List<Integer>>这个返回值是什么嗄?顺序表套顺序表?但当我们联想到顺序表底层是由数组实现的时候我们就知道,其实这就相当于一个二维数组。他的大概结构通过画图可以表示为:

在这里插入图片描述

    public static  List<List<Integer>> generate(int numRows) {
        List<List<Integer>> triangle = new ArrayList<>();
        List<Integer> row = new ArrayList<>();
        row.add(1);
        triangle.add(row);

        for(int i = 1;i < numRows;i++) {
            List<Integer> prevRow = triangle.get(i - 1);
            List<Integer> curRow = new ArrayList<>();
            curRow.add(1);
            for(int j = 1;j < i ;j++) {
                curRow.add(prevRow.get(j) + prevRow.get(j - 1));
            }
            curRow.add(1);
            triangle.add(curRow);
        }

        return triangle;
    }

因为我们需要有这样一个顺序表存储杨辉三角,所以 List<List<Integer>> triangle = new ArrayList<>();我们实例化这样一个顺序表,通过观察我们发现,无论什么样的杨辉三角,第一行总是1,所以我们创建一行 List<Integer> row = new ArrayList<>();并且将这行的元素添加为1,并且将这一行添加到triangle。之后我们再次观察发现,之后的每一行都是第一个元素为1,最后一个元素为1,剩下的元素等于上一行本列上的元素加上前一列上的元素。我们每次都是对一行操作完成后将这一行添加到triangle中。大致思路就是这样大家可以通过这道题,练习ArrayList的用法。

打扑克时的洗牌与摸牌

可以自主完成杨辉三角后我们可以尝试写一个有趣的小东西,打扑克相信大家都打过,我们现在可以用顺序表简单实现一下洗牌摸牌的过程。
既然要打牌那么我们就需要有牌这个类吧,牌都有点数和花色。

package demo1;

public class Card {
    public int rank;
    public String suit;

    @Override
    public String toString() {
        return String.format("[%s,%d]",suit,rank);
    }
}

牌有了,当我们开始打牌时需要有一副扑克牌吧:

package demo1;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class CardGame {

    private static String[] SUITS = new String[]{"♠","♥","♣","♦"};

    //打扑克需要买一副扑克
    public static List<Card> BuyCard() {
        List<Card> deck = new ArrayList<>(52);

        for(int i = 0;i < 4;i++) {
            for(int j = 1;j <=13;j++) {
                Card card = new Card();
                card.suit = SUITS[i];
                card.rank = j;
                deck.add(card);
            }
        }

        return deck;
    }
}

我们将52张牌(去除大小王)储存在一个顺序表中,这个顺序表中的元素类型就是Card,给每一张牌添加花色和点数后放入顺序表,每种花色有13个点数,完成4次循环后,52张牌的顺序表就构建完成了。

 //洗牌
    public void shuffle(List<Card> deck) {
        Random random = new Random(20221226);
        for(int i = deck.size() -1 ;i > 0;i--) {
            int r = random.nextInt(i);
            swap(deck,i,r);
        }
    }

    //交换
    private void swap(List<Card> deck,int i,int j) {
        Card tmp = deck.get(i);
        deck.set(i,deck.get(j));
        deck.set(j,tmp);
    }

上面是洗牌的方法,我们通过随机数,从后往前遍历,交换对应位置的元素与对应位置下标生成的随机数的位置的元素(Card),就实现我们的洗牌功能。

package demo1;

import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) {

        List<Card> deck = new ArrayList<>();
        CardGame cardGame = new CardGame();
        deck = cardGame.BuyCard();
        System.out.println("洗牌前:");
        System.out.println(deck);
        cardGame.shuffle(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("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));
        System.out.println("剩余的牌:");
        System.out.println(deck);

    }
}

这是模拟三个摸牌,每个人5张牌,这里摸牌的思路跟上面杨辉三角的思路有一点点像,也是一个二维数组的思路。大家可以自己看看尝试这写一下。最后运行的效果为:
在这里插入图片描述
当然我们这里就只写了洗牌和摸牌,大家有兴趣还可以自己补充一下游戏主题的内容。以上就是关于顺序表ArrayList的简单使用的介绍。

  • 22
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 19
    评论
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悲伤猪小猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值