【java数据结构】ArrayList实例
- 一、杨辉三角
- 二、打扑克
一、杨辉三角
已知条件:给定行数的大小
思路:首先定义一个二维列表(也可以称为集合),我们对每一列处理完,最后把每一列加起来,不就是完整的“杨辉三角”。所以接下来就是对每一列进行处理,已知杨辉三角每一列第一个数和最后一个数是1,所以这里直接list.add(1);中间部分遵循【i】【j】=【i-1】【j】+【i-1】【j-1】,但是这是个列表,我们并不知道上一列 i 和 j 位置的数值,所以这里需要对上一列定义一个引用,方便我们接下来找到上一列的 i 和 j 。
import java.util.ArrayList;
import java.util.List;
public class Main {
public static List<List<Integer>> Triangle(int numrows){
List<List<Integer>> ret=new ArrayList<>();
//注释1
List<Integer> list0=new ArrayList<>();
list0.add(1);
ret.add(list0);
for (int i = 1; i < numrows; i++) {
List<Integer> list=new ArrayList<>();
//开头
list.add(1);
//中间
//注释2
List<Integer> tmp=ret.get(i-1);
for (int j = 1; j < i; j++) {
int val1= tmp.get(j);
int val2= tmp.get(j-1);
list.add(val1+val2);
}
//结尾
list.add(1);
ret.add(list);
}
return ret;
}
public static void main(String[] args) {
List<List<Integer>> ret=Triangle(4);
// for (int i = 0; i < ret.size(); i++) {
// for (int j = 0; j < ret.get(i).size(); j++) {
// System.out.print(ret.get(i).get(j)+" ");
// }
// System.out.println();
// }
for (List<Integer> x:
ret) {
System.out.println(x);
}
}
}
注释1:需要先将第一列定义出来,不定义第一列,如果 i从0开始, 则**List tmp=ret.get(i-1);**这段代码就会出现数组越界的异常。
注释2:因为需要获取上一列的【i-1】【j】和【i-1】【j-1】,所以这里需要先将上一列定义出来,这里的tmp是对象的引用,不是数组。
二、打扑克
已知扑克有1-13种数字,并且有四种花色"♥",“♠”,“♣”,“♦”。
需完成的任务:
1.首先需要定义一个列表(集合),存储这52张牌,因为有数字和花色两种。
2.获得52张牌后,需要将牌打乱。
3.最后三个人轮流摸牌。
定义一副牌,牌包括花色和大小,并且重写tostring()方法
public class Poker {
int a;
String str;
public Poker(int a, String str) {
this.a = a;
this.str = str;
}
@Override
public String toString() {
return "{"+a+str+"} ";
}
}
有关牌的所有操作方法
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Method {
List<List<Integer>> card=new ArrayList<>();
public static String suit[]={"♥","♠","♣","♦"};
public List<Poker> getPoker() {
List<Poker> gPoker=new ArrayList<>();
for (int i = 1; i <=13 ; i++) {
for (int j = 0; j < 4; j++) {
String s=suit[j];
Poker poker=new Poker(i,s);
gPoker.add(poker);
}
}
return gPoker;
}
//打乱牌序
public void Disrupt(List<Poker> pokers){
Random random=new Random();
for(int i =pokers.size()-1;i>0;i--){
//随机产生i~1之间的数
int index=random.nextInt(i);
swap(pokers,i,index);
}
}
public void swap(List<Poker> pokers,int i,int j){
Poker tmp=pokers.get(i);
pokers.set(i,pokers.get(j));
pokers.set(j,tmp);
}
public List<List<Poker>> play (List<Poker> pokers){
List<Poker> hand0=new ArrayList<>();
List<Poker> hand1=new ArrayList<>();
List<Poker> hand2=new ArrayList<>();
List<List<Poker>> hand = new ArrayList<>();
hand.add(hand0);
hand.add(hand1);
hand.add(hand2);
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 3; j++) {
Poker poker =pokers.remove(0);
hand.get(j).add(poker);
}
}
return hand;
}
}
main函数,调用牌的各种操作方法
import java.util.List;
public class Test {
public static void main(String[] args) {
Method method = new Method();
//获取牌
List<Poker> ret = method.getPoker();
//洗牌
method.Disrupt(ret);
System.out.println(ret);
//三个人抓牌
//3. 3个人 每个人 轮流揭牌5张
List<List<Poker>> ret1 = method.play(ret);
for (int i = 0; i < ret1.size(); i++) {
System.out.println("第" + (i + 1) + "个人的牌:" + ret1.get(i));
}
System.out.println("剩下的牌:");
System.out.println(ret);
}
}