文章目录
- ArrayList
- 一些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
的简单使用的介绍。