【Java 数据结构】顺序表(下)

简介: 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储,在数组上完成数据的增删查改。

4、ArrayList的使用

4.1 ArrayList的遍历

对于顺序表的遍历,我们可以通过 for 循环,for-each,以及迭代器的方法遍历:

public class TestArrayList {
    public static void main(String[] args) {
        ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(1);
        arrayList.add(2);
        arrayList.add(3);
        // 通过for循环遍历ArrayList
        for (int i = 0; i < arrayList.size(); i++) {
            System.out.print(arrayList.get(i) + " ");
        }
        // 通过for-each循环遍历ArrayList
        for (Integer integer : arrayList) {
            System.out.print(integer + " ");
        }
        // 通过迭代器遍历ArrayList(了解即可)
        Iterator<Integer> it = arrayList.iterator();
        while (it.hasNext()) {
            System.out.print(it.next() + " ");
        }
    }
}

4.2 扑克牌例子

这里我们要运用我们上面学的知识写一个扑克牌的例子:

4.2.1 准备工作

首先我们肯定有一个类把我们的一张扑克抽象出来,扑克有花色和点数,那么我们就可以这样写:

public class Poker {
    private String decor;
    private int number;
    public Poker(String decor, int number) {
        this.decor = decor;
        this.number = number;
    }
    @Override
    public String toString() {
        return this.decor + this.number;
    }
}

那么我们还得需要表示多张扑克牌,同时也需要一个存放扑克牌的容器,这里我们选用 ArrayList,同时还需要一个数组来存储对应花色。

public class Pokers {
    private final String[] decor = { "♥", "♠", "♣", "♦" };
    private List<Poker> pokerList = new ArrayList<>();
    // 获取花色
    public String get(int index) {
        return decor[index];
    }
}

这里为什么可以使用 List 接收 ArrayList 的对象呢?因为 List 是一个接口,ArrayList 实现了这个接口,所以这里就实现了向上转型

4.2.2 买一副牌逻辑

准备工作都做好了,我们要实现买一副牌的逻辑,除了大小王一共有52张牌,我们这里用11 12 13 代替 J Q K,每张牌一共有四种花色,也就是定义一个双层循环遍历放入到我们的容器中即可,最后在放入我们的大小王,这里不涉及太复杂,就定大小王的点数为0!

4.2.3 洗牌逻辑

买一副扑克牌的逻辑写好了,那么现在就应该洗牌了,那么洗牌应该怎么去实现他呢?

我们可以运用 Random 类中产生随机数方法,但是产生了随机数,如何打乱牌呢?

如果从最后一个开始洗,即 last 位置开始,产生 last 的随机数是 [0~last) ,不包含last,所以我们可以从后往前洗牌,每次把最后一张牌与产生的随机数位置的牌交换即可。(不考虑业务性)

4.2.3 发牌逻辑(重点)

如何去模拟实现发牌呢?一共有三个人打牌,每个人轮流摸牌,如果是54张牌要摸18轮,摸到的牌是不是也应该放到对应的人手上,站在编程的角度,应该摸到的牌应该放在对应那个人的容器中。

如何表示我们上述的设想呢?假设我们有一个顺序表,一共三个元素,分别代表三个人,而每个元素里面又放着一个顺序表,而这个顺序表对应着这个人摸到的牌!我们就能画出这样的图:

通过图我们想一想,这个结构不就是有一个ArrayList吗?然后ArrayList里面放的元素类型还是ArrayList,我们要传什么实参类型进去呢?当然是Poker了啊,因为里面的ArrayList最后是要放扑克牌的!于是我们就能写出这样的代码:

这里我们要说一点,发牌的时候,每次都是删除第一张牌,并且把删除的第一张牌增加到对应用户的手牌中,这样也就形成了摸牌逻辑,最后把牌打印出来就好了!

4.2.4 测试整体逻辑

最终我们在main方法中调用如上的 testGame方法实现的是这样一个效果:

到这就实现的差不多啦!买牌,洗牌,发牌逻辑都没问题,这个小练习,不涉及业务,我们主要是把学习的顺序表知识运用起来,听博主一句话,学数据结构,多敲代码多画图!

相关文章
|
8月前
|
前端开发 Java
java实现队列数据结构代码详解
本文详细解析了Java中队列数据结构的实现,包括队列的基本概念、应用场景及代码实现。队列是一种遵循“先进先出”原则的线性结构,支持在队尾插入和队头删除操作。文章介绍了顺序队列与链式队列,并重点分析了循环队列的实现方式以解决溢出问题。通过具体代码示例(如`enqueue`入队和`dequeue`出队),展示了队列的操作逻辑,帮助读者深入理解其工作机制。
280 1
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
858 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
6月前
|
存储 安全 Java
Java 集合面试题从数据结构到 HashMap 源码剖析详解及长尾考点梳理
本文深入解析Java集合框架,涵盖基础概念、常见集合类型及HashMap的底层数据结构与源码实现。从Collection、Map到Iterator接口,逐一剖析其特性与应用场景。重点解读HashMap在JDK1.7与1.8中的数据结构演变,包括数组+链表+红黑树优化,以及put方法和扩容机制的实现细节。结合订单管理与用户权限管理等实际案例,展示集合框架的应用价值,助你全面掌握相关知识,轻松应对面试与开发需求。
339 3
|
存储 Java
Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。
【10月更文挑战第19天】本文详细介绍了Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。HashMap以其高效的插入、查找和删除操作著称,而TreeMap则擅长于保持元素的自然排序或自定义排序,两者各具优势,适用于不同的开发场景。
150 1
|
存储 Java
告别混乱!用Java Map优雅管理你的数据结构
【10月更文挑战第17天】在软件开发中,随着项目复杂度增加,数据结构的组织和管理至关重要。Java中的Map接口提供了一种优雅的解决方案,帮助我们高效、清晰地管理数据。本文通过在线购物平台的案例,展示了Map在商品管理、用户管理和订单管理中的具体应用,有效提升了代码质量和维护性。
241 2
|
存储 Java 开发者
Java Map实战:用HashMap和TreeMap轻松解决复杂数据结构问题!
【10月更文挑战第17天】本文深入探讨了Java中HashMap和TreeMap两种Map类型的特性和应用场景。HashMap基于哈希表实现,支持高效的数据操作且允许键值为null;TreeMap基于红黑树实现,支持自然排序或自定义排序,确保元素有序。文章通过具体示例展示了两者的实战应用,帮助开发者根据实际需求选择合适的数据结构,提高开发效率。
286 2
|
8月前
|
存储 Java 编译器
Java 中 .length 的使用方法:深入理解 Java 数据结构中的长度获取机制
本文深入解析了 Java 中 `.length` 的使用方法及其在不同数据结构中的应用。对于数组,通过 `.length` 属性获取元素数量;字符串则使用 `.length()` 方法计算字符数;集合类如 `ArrayList` 采用 `.size()` 方法统计元素个数。此外,基本数据类型和包装类不支持长度属性。掌握这些区别,有助于开发者避免常见错误,提升代码质量。
829 1
|
11月前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】顺序表的基本运算(头歌实践教学平台习题)【合集】
本文档介绍了线性表的基本运算任务,涵盖顺序表和链表的初始化、销毁、判定是否为空、求长度、输出、查找元素、插入和删除元素等内容。通过C++代码示例详细展示了每一步骤的具体实现方法,并提供了测试说明和通关代码。 主要内容包括: - **任务描述**:实现顺序表的基本运算。 - **相关知识**:介绍线性表的基本概念及操作,如初始化、销毁、判定是否为空表等。 - **具体操作**:详述顺序表和链表的初始化、求长度、输出、查找、插入和删除元素的方法,并附有代码示例。 - **测试说明**:提供测试输入和预期输出,确保代码正确性。 - **通关代码**:给出完整的C++代码实现,帮助完成任务。 文档
391 5
|
12月前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
196 5

热门文章

最新文章