目录
三.删除第一个字符串中出现的第二个字符串的字符.(CETV面试题)
前言
了解ArrayList的底层构造原理和简单操作方法后,为了能更加灵活的应用ArrayList,需要做一些以ArrayList为基本实现方法的习题,加深对知识的灵活应用能力.所以今天为为大家带来三道非常经典的题目讲解--扑克牌发牌器,杨辉三角,删除重复元素.
一.扑克牌发牌器
为了模拟实现一个扑克牌发牌器,我们需要做的操作有:
1.购买扑克牌.
2.打乱扑克牌的顺序.
3.为指定的人数轮流发牌.
1)购买扑克牌:
由扑克牌的基本特点可知,一张扑克牌需要有花色和数字,所以我们首先要将扑克牌面向对象,创建一个扑克牌类,其中包含花色和数字,并重写其中的toString()方法,以便更好的表示扑克牌.
class Card {
private int rank;
private String suit;
public Card(int rank, String suit) {
this.rank = rank;
this.suit = suit;
}
@Override
public String toString() {
return "[" + this.suit + " " + this.rank + "]";
}
}
创建好一张扑克牌对象后,我们需要52张扑克牌(为方便表示去掉大小王),有四种花色,每种花色13张牌.所以我们可以用一个数组来存放花色,再创建一个for循环遍历每一个花色,这样就可以把每张扑克牌的花色和数字组合在一起.由于之前已重写toString()方法,所以只要我们打印扑克牌对象就能得到所有组装好的扑克牌.
public class demo7_30{
private static final String suits[] = {"♠","♥","♣","♦"};
public static List<Card> buyCard(){//买扑克牌
ArrayList<Card> cards = new ArrayList<>();
for (int i = 0; i < suits.length; i++) {
for (int j = 1; j <=13 ; j++) {
cards.add(new Card(j,suits[i]));
}
}
return cards;
}
public static void main(String[] args) {//扑克牌
List<Card> cards = buyCard();
System.out.println("买扑克"+cards);
}
}
2)洗牌:
为了使一副扑克牌达到随机的效果,我们洗牌时的主要思想就是用Random函数来实现扑克牌排列的随机性,但是Random(x)函数只能随机0-x的数字,我们很有可能抽到要交换的数字.为了解决这一问题,我们可以从后往前交换扑克牌,当i=13时,Random(i)只会随机到[0-13)的数字.有了随机数字和待交换数字之后我们就可以,实现一个swap()方法来交换数字.但此时要注意:我们的扑克牌以面向对象不在是一个简单的数组,所以要用集合的方法来获取并改变元素,获取元素用get()方法,改变元素用set(index,要改变的元素)方法.
private static void swap(List<Card> cards,int ran,int i){//交换牌
Card tmp = cards.get(i);
cards.set(i,cards.get(ran));
cards.set(ran,tmp);
}
public static List<Card> wash(List<Card> cards){//洗牌
int size = cards.size();
for (int i = size-1; i >0 ; i--) {
Random random = new Random();
int ran = random.nextInt(i);
swap(cards,ran,i);
}
return cards;
}
public static void main(String[] args) {//扑克牌
List<Card> cards1 = wash(cards);
System.out.println("洗扑克"+cards1);
}
3)发牌:(四个人轮流发13张牌)
我们可以把发牌器和每个人都看做是一个集合对象,只不过发牌器中存放的是每个人的集合,而每个人中存放的扑克牌的集合,那么我们就可以把发牌器抽象成一个二维数组,这样就可以通过发牌器的下标来访问到每一个人的扑克牌集合.发牌时,从扑克牌的集合中取出一张放入发牌器下标所对应的人即可.
ArrayList<ArrayList<Card>> hand = new ArrayList<>();//二维数组
ArrayList<Card> hand1 = new ArrayList<>();
ArrayList<Card> hand2 = new ArrayList<>();
ArrayList<Card> hand3 = new ArrayList<>();
ArrayList<Card> hand4 = new ArrayList<>();
hand.add(hand1);
hand.add(hand2);
hand.add(hand3);
hand.add(hand4);
for (int i = 0; i < 13; i++) {//14张牌
for (int j = 0; j < 4; j++) {//4个人
Card card = cards.remove(0);
hand.get(j).add(card);
}
}
System.out.println("第一个人的牌:"+hand1+"\t");
System.out.println("第二个人的牌:"+hand2+"\t");
System.out.println("第三个人的牌:"+hand3+"\t");
System.out.println("第四个人的牌:"+hand4+"\t");
}
二.杨辉三角
杨辉三角相信大家已经不陌生了,今天我们就从集合的角度来实现杨辉三角.首先定义 一个存放List集合的集合,其实本质就是二维数组 .我们将每一行的元素放入List集合中,再将准备好的List集合放入List的嵌套集合中,这样就可构成一个完整的杨辉三角.
public static void main(String[] args) {
List<List<Integer>> ret = new ArrayList<>();
List<Integer> list1 = new ArrayList<>();
list1.add(1);//第一行
ret.add(list1);
for (int i = 1; i < 5; i++) {
List<Integer> prevRow = ret.get(i - 1);
List<Integer> list = new ArrayList<>();
list.add(1);//第一个元素
for (int j = 1; j < i; j++) {
int nums = prevRow.get(j) + prevRow.get(j - 1);
list.add(nums);
}
list.add(1);//每一行的结尾
ret.add(list);
}
for (int i = 0; i < 5; i++) {
System.out.println(ret.get(i)+"\t");
}
}
三.删除第一个字符串中出现的第二个字符串的字符.(CETV面试题)
这是一道非常经典的面试题,只要掌握ArrayList集合的应用,便可以很容易做出.我们只需要遍历第一个字符串,并检查是否出现第二个字符串中的字母,如果不出现就放入ArrayList集合当中即可.注意这道题不能使用数组,否则打印出的元素重复位置会带有null或者我们不需要的元素.这恰好体现了集合的优越性.
public static void main(String[] args) {
//删除第一个字符串中出现的第二个字符串的字符CVTE面试题
String str1 = "Welcome to cevt ";
String str2 = "come";
ArrayList<Character> List = new ArrayList<>();
for (int i = 0; i < str1.length(); i++) {
char ret = str1.charAt(i);
if (!str2.contains(ret+"")){
List.add(ret);
}
}
for (char ret:List) {
System.out.print(ret+"");
}
}
总结
以上就是ArrayList集合应用的全部内容了,从ArrayList的底层构造原理实现到熟练掌握并应用,标着着我们对集合的学习已经迈入了一大步,后续还会陆续更新栈,队列,二叉树等内容.如果我的文章对你有亿点点帮助和启发,麻烦不要忘记三连哦!