当前位置: 首页 > article >正文

ArrayList类

ArrayList类

  • 一:概念
  • 二:ArrayList的遍历
  • 三:杨辉三角
  • 四:简单的洗牌算法:

一:概念

在集合框架中,ArrayList是一个普通的类,实现了List接口。
说明:
1:ArrayList是以泛型形式实现的,使用时必须实例化。
2:ArrayList实现了Cloneable接口,说明ArrayList是可以clone的
3:ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表

二:ArrayList的遍历

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

public class Test {
    public static void main(String[] args) {
        List<Integer> list=new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        //第一种遍历方式
        System.out.println(list);
        //第2种遍历方式:for
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i)+" ");//获得i下标的元素并输出
        }
        System.out.println();
        //第3种遍历方式:for-each
        for (int x: list) {
            System.out.print(x+" ");
        }
        //第4种遍历方式:Iterator
        System.out.println();
        Iterator iterator= list.iterator();
        while (iterator.hasNext()){
            System.out.print(iterator.next()+" ");
        }
        System.out.println();
        //第5种遍历方式ListIterator
        ListIterator it= list.listIterator();
        while (it.hasNext()){
            System.out.print(it.next()+" ");
        }
        System.out.println();
        //第6种遍历方式:从后往前遍历
        ListIterator iterator1=list.listIterator(list.size());
        while (iterator1.hasPrevious()){
            System.out.print(iterator1.previous()+" ");
        }
    }
}

在这里插入图片描述

三:杨辉三角

给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。
杨辉三角的值可以分成两部分,第一列元素和最后一类元素均为1,中间元素等于上一行的当前列和上一行当前列的前一列:
在这里插入图片描述
比如上图中的第3行,第一个元素和最后一个元素都是1;第二个元素等于第2行的第2列(当前列)和第2行的第1列(前1列)数值之和,第3个元素等于第2行的第3列(当前列)和第二行的第2列(前2列)数值之和;
力扣链接:
https://leetcode.cn/problems/pascals-triangle/

class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> num=new ArrayList<>();
        //因为每一行都是一组元素,这里定义了一个二维数组
        List <Integer> ret=new ArrayList<>();
        //第一一个一维数组ret ,存放第一行的元素
        ret.add(1);
        num.add(ret);//将第一行的元素添加到二维数组中
        for(int i=1;i<numRows;i++){
            List<Integer> curRows=new ArrayList<>();//每次循环定义一个一维数组,
            //                                        表示当前行
            curRows.add(1);//每一行的第一个元素添加为1
            //定义一个一维数组preRows
            // preRows=num.get(i-1), preRows表示上一行
             List <Integer> preRows=new ArrayList<>();
                preRows=num.get(i-1);
            for(int j=1;j<i;j++){
                int x=preRows.get(j)+preRows.get(j-1);
                //将上一行的当前列和上一行的前1列求和
                curRows.add(x);
                //将求的和添加到当前行
            }
            curRows.add(1);//每一行的最后一个元素添加为1
            num.add(curRows);//将每一行的元素添加到二维数组中          
        }
         return num;
    } 
}

四:简单的洗牌算法:

下面主要写三个方法:
1:买牌方法:
2:洗牌方法:
3:发牌方法:
在这里插入图片描述首先:一张牌就是我们研究的对象,它具有两个属性:花色和大小:

 public String suit;//颜色
    public int num;//数字

买牌操作就是将52张牌实例化出来(每张牌有花色和数字),那么这52张牌并不是单独的,我们创建一个数组,用于存放这52张牌;
买牌

 public String[] cards={"♥","♠","♣","♦"};//创建一个数组,便于实例化一张牌
    public List<Card> buyCard(){
        List<Card> cardList=new ArrayList<>();//存放所有的牌
        for (int i = 0; i < cards.length; i++) {
            for (int j = 1; j <=13; j++) {
                Card card=new Card(cards[i],j);
                cardList.add(card);//将每张实例化的牌添加到数组中
            }
        }
        return cardList;
    }

2:洗牌就是将这些牌的顺序打乱:
这里采取的是将某一张牌与它前面的任意一张牌进行交换。
洗牌

  public List<Card> shuffle(List<Card> ret){
        Random random=new Random();//随机数
        for (int i = ret.size()-1; i>0; i--) {
            int index=random.nextInt(i);//产生0-(i-1)随机数
            swap(ret,i,index);//将i下标的牌与index下标的牌进行交换
        }
        return ret;
    }
    public void swap(List<Card> cardList,int i,int index){
        Card tmp=cardList.get(i);//定义中间变量tmp
        cardList.set(i,cardList.get(index));
        cardList.set(index,tmp);
    }

发牌:
这里的场景是有三个人,轮流摸5张牌。
因为每个人拿了5张牌,可以为每个人创建一个数组,用存放每个人拿到的牌。
我们把这3个玩家放在一个数组中,发牌的时候可以根据下边来进行遍历,从而进行发牌操作。
我们玩牌的时候:每个人拿的都是最上面的牌:因为当玩家把最上面的牌拿走后,意味着将这张牌从一堆牌中移除了,在这里借助的也是这个思想,

  public List<List<Card>> getCardList(List<Card> ret){
        List<Card> hand1=new ArrayList<>();//玩家1,hand1
        List<Card> hand2=new ArrayList<>();//玩家2,hand2
        List<Card> hand3=new ArrayList<>();//玩家3,hand3
        List<List<Card>> hand=new ArrayList<>(3);
        hand.add(hand1);
        hand.add(hand2);
        hand.add(hand3);
        for (int i = 0; i <5; i++) {
            for (int j = 0; j < hand.size(); j++) {
                Card card=ret.remove(0);//获得第一张牌,并移除
                hand.get(j).add(card);//j下标的人拿到牌
            }
        }
        return hand;

    }

代码实现:

//Card类
public class Card {
    public String suit;//颜色
    public int num;//数字

    public Card(String suit, int num) {
        this.suit = suit;
        this.num = num;
    }

    @Override
    public String toString() {
        return suit+" "+num;
    }
}
//CardList类 
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;

public class CardList {
    public String[] cards={"♥","♠","♣","♦"};//创建一个数组,便于实例化一张牌
    public List<Card> buyCard(){
        List<Card> cardList=new ArrayList<>();//存放所有的牌
        for (int i = 0; i < cards.length; i++) {
            for (int j = 1; j <=13; j++) {
                Card card=new Card(cards[i],j);
                cardList.add(card);//将每张实例化的牌添加到数组中
            }
        }
        return cardList;
    }
    public List<Card> shuffle(List<Card> ret){
        Random random=new Random();//随机数
        for (int i = ret.size()-1; i>0; i--) {
            int index=random.nextInt(i);//产生0-(i-1)随机数
            swap(ret,i,index);//将i下标的牌与index下标的牌进行交换
        }
        return ret;
    }
    public void swap(List<Card> cardList,int i,int index){
        Card tmp=cardList.get(i);//定义中间变量tmp
        cardList.set(i,cardList.get(index));
        cardList.set(index,tmp);
    }
    public List<List<Card>> getCardList(List<Card> ret){
        List<Card> hand1=new ArrayList<>();//玩家1,hand1
        List<Card> hand2=new ArrayList<>();//玩家2,hand2
        List<Card> hand3=new ArrayList<>();//玩家3,hand3
        List<List<Card>> hand=new ArrayList<>(3);
        hand.add(hand1);
        hand.add(hand2);
        hand.add(hand3);
        for (int i = 0; i <5; i++) {
            for (int j = 0; j < hand.size(); j++) {
                Card card=ret.remove(0);//获得第一张牌,并移除
                hand.get(j).add(card);//j下标的人拿到牌
            }
        }
        return hand;

    }


}
//Test类:
import java.util.List;

public class Test {
    public static void main(String[] args) {
        CardList cardList=new CardList();
        List<Card> ret=cardList.buyCard();
        System.out.println("买牌:");
        System.out.println(cardList.buyCard());
        System.out.println("洗牌:");
        System.out.println(cardList.shuffle(ret));

        System.out.println("揭牌:");
        List<List<Card>> hand = cardList.getCardList(ret);
        for (int i = 0; i < hand.size(); i++) {
            System.out.println("第 "+(i+1)+" 个人的牌:"+hand.get(i));
        }


    }
}


http://www.kler.cn/a/146474.html

相关文章:

  • 从AI原理到模型演进及代码实践 的学习二
  • [0242-07].第09节:SpringBoot中简单功能分析
  • 【从零开始使用系列】StyleGAN2:开源图像生成网络——环境搭建与基础使用篇(附大量测试图)
  • 【0393】Postgres内核 checkpointer process ③ 构建 WAL records 工作缓存区
  • MySQL NaviCat 安装及配置教程(Windows)【安装】
  • ubuntu20.04安装MySQL5.7
  • 编程中的解密之路:挑战、创新与技术难题的探索
  • 二十七、RestClient查询文档
  • 跨链原子交换
  • 《微信小程序开发从入门到实战》学习三十二
  • Spring Boot + hutool 创建海报图片
  • Typescript和Javascript的区别是什么?一文带您了解Typescript排名飙升的原因!
  • Open3D库进行点云的DBSCAN密度聚类和可视化 c++ 代码
  • 【Java】使用IntelliJ IDEA搭建SSM(MyBatis-Plus)框架并连接MySQL数据库
  • 【开源】基于Vue和SpringBoot的木马文件检测系统
  • 在Linux中对Docker中的服务设置自启动
  • 一起学docker系列之八使用 Docker 安装配置 MySQL
  • 梨花声音教育,美食视频配音再次挑战味蕾
  • rdf-file:分布式环境下的文件处理
  • 131.类型题-计算数学序列的和,请编写函数fun,其功能是S=……【满分解题代码+详细分析】(数学序列的和类型题-C/C++JavaPython实现)
  • 小程序wx:if和hidden的区别?
  • 卸载软件最最最彻底的工具——Uninstall Tool
  • PgSQL技术内幕-Analyze做的那些事-pg_stat_all_tables
  • LLaMA 2:开源的预训练和微调语言模型推理引擎 | 开源日报 No.86
  • 【虚拟机】在VM中安装 CentOS 7
  • 如何使用内网穿透将Tomcat网页发布到公共互联网上【内网穿透】