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