【java数据结构】ArrayList实例
【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<>();//注释1List<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);//中间//注释2List<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;}@Overridepublic 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);}
}