我们用实际的用例解释一下ArrayList的具体使用。
1.简单的洗牌算法
有一副扑克牌,除去大小王,有52张,要求我们打乱所有牌的顺序,分发给3个人,并让他们展示手中的牌(不要求排序)。
1.1牌
/**
* Describe:一张牌的相关信息
* User:lenovo
* Date:2022-12-30
* Time:13:11
*/
public class Card {
private int rank;//牌的面值
private String suit;//牌的花色
//构造方法
public Card(int rank, String suit) {
this.rank = rank;
this.suit = suit;
}
public Card() {}
//设置成员变量的方法
public void set(int rank) {
this.rank = rank;
}
public void set(String suit) {
this.suit = suit;
}
public void set(int rank, String suit) {
this.rank = rank;
this.suit = suit;
}
//toString()
public String toString() {
return String.format("[%d,%s]",rank,suit);
}
}
第一步我们先创建牌,成员变量包含:牌的面值、牌的花色。下面的成员方法,我们可以在使用到的时候在进行创建。这里我直接把可能会用到的方法直接写出(一些方法可能没用到,但是问题不大)。
1.2创建一副牌
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
* Describe:一副牌的相关信息,不包含大小王,有洗牌的方法
* User:lenovo
* Date:2022-12-30
* Time:13:18
*/
public class CardDemo {
private static final String[] SUITS = {"♥", "♠", "♦", "♣"};
private List<Card> cardDemo = new ArrayList<>(52);
//构造方法
public CardDemo() {
for (int i = 0; i < 4; i++) {
for (int j = 1; j < 13; j++) {
String suit = SUITS[i];
int rank = j;
Card card = new Card(rank, suit);
cardDemo.add(card);
}
}
}
//洗牌操作
public void shuffle() {
Random random = new Random(this.cardDemo.size());
for (int i = 0; i < this.cardDemo.size(); i++) {
int j = random.nextInt(this.cardDemo.size());
swap(this.cardDemo, i, j);
}
}
/**
* 交换指定牌的位置
*/
private void swap(List<Card> cardDemo, int i, int j) {
Card card1 = cardDemo.get(i);
Card card2 = cardDemo.get(j);
Card tmp = card1;
cardDemo.set(i, card2);
cardDemo.set(j, tmp);
}
//获取数组
public List<Card> getCardDemo() {
return cardDemo;
}
}
一副牌包含52张(去掉大小王),成员变量包含:52张牌,成员方法包含:构造方法(并将牌进行初始化),洗牌方法,成员变量的获取方法。
1.3进行测试
import java.util.ArrayList;
import java.util.List;
/**
* Describe:
* User:lenovo
* Date:2022-12-30
* Time:17:14
*/
public class Test {
public static void main(String[] args) {
CardDemo deck = new CardDemo();
//进行洗牌操作
deck.shuffle();
//进行分牌
List<List<Card>> players = new ArrayList<>();
players.add(new ArrayList<>());
players.add(new ArrayList<>());
players.add(new ArrayList<>());
//开始分牌,一个人5张
for (int i = 0; i < 5; i++) {
for (int j = 0; j < players.size(); j++) {
players.get(j).add(deck.getCardDemo().remove(0));
}
}
System.out.println(players.get(0).toString());
System.out.println(players.get(1).toString());
System.out.println(players.get(2).toString());
}
}
我们创建一副牌,并进行洗牌操作,把这些牌分给3个人,每人5张。这里使用数组的remove()方法进行分牌,这会造成一副牌(对象)的数量逐渐减少。
1.4结果展示
2.杨辉三角
利用顺序表的思想,输出杨辉三角的前N行。
import java.util.ArrayList;
import java.util.List;
/**
* Describe:求出杨辉三角的前N行
* User:lenovo
* Date:2022-12-30
* Time:19:16
*/
public class Test {
public static List<List<Integer>> generate(int numRows) {
List<List<Integer>> array = new ArrayList<>(numRows);
//要填充的前一行
List<Integer> lastArray1 = new ArrayList<>();
for (int i = 0; i < numRows; i++) {
//要填充的一行
List<Integer> array1 = new ArrayList<>();
//第一个元素
array1.add(1);
//第2个到i-1个元素
for (int j = 1; j < i; j++) {
lastArray1 = array.get(i - 1);
array1.add(lastArray1.get(j - 1) + lastArray1.get(j));
}
//最后一个元素
if(i != 0) {
array1.add(1);
}
array.add(array1);
}
return array;
}
public static void main(String[] args) {
int n = 6;
List<List<Integer>> array = generate(n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < array.get(i).size(); j++) {
System.out.print(array.get(i).get(j) + " ");
}
System.out.println();
}
}
}
我们要根据杨辉三角的规律来进行解题,第array[i][j] = array[i -1][j - 1] + array[i - 1][j];第一个元素和最后一个元素都是1,即可解出此题。