【C#进阶】简单数据结构类

news2024/11/19 2:27:29

在这里插入图片描述
简单数据结构类
在这里插入图片描述

文章目录

      • 1、Arraylist
        • 1、ArrayList的本质
        • 2、声明
        • 3、增删查改
        • 4、装箱拆箱
          • 思考 背包售卖
      • 2、Stack
        • 1、Stack的本质
        • 2、声明
        • 3、增取查改
        • 4、遍历
          • 思考 计算一个数的二进制
      • 3、Queue
        • 1、Queue的本质
        • 2、声明
        • 3、增取查改
        • 4、遍历
          • 思考 每隔一段时间打印一条消息
      • 4、Hashtable
        • 1、Hashtable本质
        • 2、声明
        • 3、增删查改
        • 4、遍历
          • 思考 单例制造怪物工厂

1、Arraylist

1、ArrayList的本质
ArrayLists是一个C#为封装好的类
它的本质是一个Object类型的数组
2、声明
using System.Collections;
ArrayList array = new ArrayList();
3、增删查改

array.Add(1);
ArrayList array2 = new ArrayList();
array2.Add(true);
//批量增加
array.AddRange(array2);

array.Insert(1,"222");

移除指定元素
	array.Remove(1);
移除指定位置的元素
	array.RemoveAt(2);
清空
    array.Clear();

得到指定的元素
	array[0];
查看元素是否存在
    if(array.Contains("1")){
        Console.WriteLine("存在");
    }
正向查找元素位置
	找到的返回值是位置,没找到返回-1
    int index = array.IndexOf(true);
	Console.WriteLine(index);

反向查找元素位置
    int index = array.LastIndexOf(true);
	Console.WriteLine(index);

array[0] = "666";
Console.WriteLine(array[0]);

遍历

长度
	Console.WriteLine(array.Count);
容量
    Console.WriteLine(array.Capacity);
遍历
    for(int i = 0; i < array.Count; i++){
        Console.WriteLine(array[i]);
    }
迭代器遍历
    foreach (object item in arrayList)
	{
    	Console.WriteLine(item);
	}
4、装箱拆箱
ArrayList本质是一个可以自动扩容的object数组
存储值类型装箱,将值类型取出来拆箱
    int i = 1;
	array[0] = i;		//装箱
	i = (int)array[0];	//拆箱
思考 背包售卖
//创建一个背包管理类,使用ArrayList存储物品
//实现购买物品,卖出物品,显示物品的功能;购买与卖出会导致金钱的变化
BagMgr bag = new BagMgr(9999);
Item i1 = new Item(1,9,"药",5);
Item i2 = new Item(2,99,"书",3);
Item i3 = new Item(3,999,"刀",1);
bag.BuyItem(i1);
bag.BuyItem(i2);
bag.BuyItem(i3);

bag.SellItem(i3);
bag.SellItem(1,1);
bag.SellItem(2,1);
class BagMgr
{
    private ArrayList items;
    private int money;
    public BagMgr(int money)
    {
        this.money = money;
        items = new ArrayList();
    }
    public void BuyItem(Item item)
    {
        if (item.num <= 0 || item.money < 0)
        {
            Console.WriteLine("错误物品或金钱");
            return;
        }
        if (money < item.money * item.num)
        {
            Console.WriteLine("钱不够");
            return;
        }
        money -= item.money * item.num;
        Console.WriteLine("购买{0}{1}个,花费{2}钱,余额{3}", item.name,item.num,item.money*item.num,money);
        for (int i = 0; i < items.Count;i++)
        {
            if ((items[i] as Item).id == item.id)
            {
                (items[i] as Item).num += item.num;
                return;
            }
        }
        items.Add(item);
    }
    public void SellItem(Item item)
    {
        for (int i = 0; i < items.Count; i++)
        {
            if ((items[i] as Item).id == item.id)
            {
                int num = 0;
                string name = (items[i] as Item).name;
                int money = (items[i] as Item).money;
                if ((items[i] as Item).num > item.num)
                {
                    num = item.num;
                }
                else
                {
                    num = (items[i] as Item).num;
                    items.RemoveAt(i);
                }
                int sellMoney = money* num;
                this.money += sellMoney;
                Console.WriteLine("卖了{0}{1}个,赚了{2},余额{3}", name, num, sellMoney, this.money);
                return;
            }
        }
        
    }
    public void SellItem(int id, int num = 1)
    {
        Item item = new Item(id,num);
        
        SellItem(item);
    }
    
    public void ShowItem()
    {
        Item item;
        for (int i = 0; i < items.Count; i++)
        {
            item = items[i] as Item;
            Console.WriteLine("有{0}{1}个", item.name, item.num);
        }
        Console.WriteLine("余额{0}",money);
    }
}
class Item
{
    public int id;
    public int money;
    public string name;
    public int num;
    public Item(int id, int num)
    {
        this.id = id;
        this.num = num;
    }
    public Item(int id, int money, string name, int num)
    {
        this.id = id;
        this.money = money;
        this.name = name;
        this.num = num;
    }
}

2、Stack

1、Stack的本质
Stack 是一个C#为我们封装好的类
它的本质是Object[]数组
Stack是栈存储容器,栈是一种先进后出的数据结构
2、声明
Stack stack = new Stack();
3、增取查改
//压栈
	stack.Push(1);
	stack.Push("123");
	stack.Push(true);//弹栈
    //栈中不存在删除的概念,只有取的概念
    object v1 = stack.Pop();
    Console.WriteLine(v1);

    v1 = stack.Pop();
    Console.WriteLine(v1);//栈无法查看指定位置的元素,只能查看栈顶的内容
    v1 = stack.Peek();
    Console.WriteLine(v1);

	//2、查看元素是否存在于栈中
    if (stack.Contains("123"))
    {
        Console.WriteLine("存在123");
    }//栈无法改变其中的元素,只能存和取,有清空方法
	stack.Clear();
4、遍历
1、长度
	Console.WriteLine(stack.Count);

2、用foreack遍历//遍历出来的顺序从顶到低
    foreach(object item in stack)
    {
        Console.WriteLine(item);
    }

3、将栈转换为object数组//遍历出来的顺序从顶到低
    object[] array = stack.ToArray();
    for (int i = 0; i < array.Length; i++)
    {
        Console.WriteLine(array[i]);
    }

4、循环弹栈
    while (stack.Count > 0)
    {
        object item = stack.Pop();
        Console.WriteLine(item);
    }
思考 计算一个数的二进制
//写一个方法计算任意一个数的二进制
//使用栈结构方式存储,之后打印处理
Calc(10);
static void Calc(uint num)
{
    Stack stack = new Stack();
    while (true)
    {
        stack.Push(num % 2);
        num /= 2;
        if (num == 1 || num ==0)
        {
            stack.Push(num);
            break;
        }
            
    }
    while(stack.Count > 0)
    {
        Console.Write(stack.Pop());
    }
}

3、Queue

1、Queue的本质
Stack 是一个C#为我们封装好的类
它的本质是Object[]数组
Queue是队列存储容器
队列是一种先进先出的数据结构
2、声明
Queue queue = new Queue();
3、增取查改
Queue queue = new Queue();
    queue.Enqueue(1);
    queue.Enqueue("123");
    queue.Enqueue(1.3f);
取 取出先进入的对象
    object v = queue.Dequeue();
    Console.WriteLine(v);1、查看队列头部元素但不会移除
	v = queue.Peek();
	2、查看元素是否存在于队列中
    if (queue.Contains(1.3f){
        Console.WriteLine("存在");
    }queue.Clear();
4、遍历
1、长度
	Console.WriteLine(queue.Count);
2、用foreach遍历
    foreach (object o in queue)
    {
        Console.WriteLine(o);
    }
3、转换为数组for
    object[] array = queue.ToArray();
    for (int i = 0; i < array.Length; i++)
    {
        Console.WriteLine(array[i]);
    }
4、循环出列
    while (queue.Count > 0)
    {
        object o = queue.Dequeue();
        Console.WriteLine(o);
    }
思考 每隔一段时间打印一条消息
//使用队列存储消息,一次性存10条消息,每隔一段时间打印一条消息
//控制台打印消息时要有明显顿挫感
Queue queue = new Queue();
queue.Enqueue("获得44金币");
queue.Enqueue("获得装备");
queue.Enqueue("获得药草");
queue.Enqueue("获得经验");
queue.Enqueue("获得秘籍");
queue.Enqueue("获得顶级秘笈");

queue.Enqueue("获得装备");
queue.Enqueue("获得药草");
queue.Enqueue("获得经验");
queue.Enqueue("获得秘籍");
queue.Enqueue("获得无上心法");

int updateIndex = 1;
while (queue.Count > 0)
{
    if (updateIndex % 77777777 == 0)
    {
        if (queue.Count > 0)
        {
            Console.WriteLine(queue.Dequeue());
        }
        updateIndex = 0;
    }
    updateIndex++;
}

4、Hashtable

1、Hashtable本质
Hashtable(散列表)
	是基于键的哈希代码组织起来的键值对
它的主要作用是提高数据查询的效率
使用键来访问集合中的元素
2、声明
Hashtable hashtable = new Hashtable();	
3、增删查改
//不能出现相同的键
    hashtable.Add(1,"234");
    hashtable.Add(2,"255");//1、只能通过键去删除
    hashtable.Remove(2);
    //删除不存在的键,没反应
    //2、直接清空
    hashtable.Clear();//1、通过键查看值,找不到返回空
    Console.WriteLine(hashtable[1]);
    //2、查看书否存在
    //根据键检测
    if (hashtable.Contains(1))
    {
        Console.WriteLine("存在");
    }
    if (hashtable.ContainsKey(2))
    {
        Console.WriteLine("存在");
	}
//根据值检测
    if (hashtable.ContainsValue("255"))
    {
        Console.WriteLine("存在");
    }//只能改键对应的值内容,无法改键
    hashtable[1] = false;
4、遍历
得到键值对 对数
	Console.WriteLine(hashtable.Count);
1、遍历所有键
    foreach (Hashtable ht in hashtable.Keys)
    {
        Console.WriteLine("键" + ht);
        Console.WriteLine("值" + hashtable[ht]);
    }
2、遍历所有值
    foreach (Hashtable ht in hashtable.Values)
    {
        Console.WriteLine("值" + ht);
    }
3、键值对一起遍历
    foreach(DictionaryEntry item in hashtable)
    {
        Console.WriteLine("键" + item.Key + "值" + item.Value);
    }
4、迭代器遍历
    IDictionaryEnumerator myEnumerator = hashtable.GetEnumerator();
    bool flag = myEnumerator.MoveNext();
    while (flag)
    {
        Console.WriteLine("键" + myEnumerator.Key + "值" + myEnumerator.Value);
        flag = myEnumerator.MoveNext();
    }
思考 单例制造怪物工厂
//制作一个怪物类管理器,提供创建怪物
//移除怪物的方法,每个怪物都有自己的唯一id
MonsterMgr.Instance.AddMonster();
MonsterMgr.Instance.AddMonster();
MonsterMgr.Instance.AddMonster();
MonsterMgr.Instance.AddMonster();
MonsterMgr.Instance.AddMonster();
MonsterMgr.Instance.AddMonster();
MonsterMgr.Instance.RemoveMonster(0);
MonsterMgr.Instance.RemoveMonster(5);
class MonsterMgr 
{ 
    private static MonsterMgr instance = new MonsterMgr();
    private Hashtable monstersTable = new Hashtable();
    private MonsterMgr() { }
    public static MonsterMgr Instance
    {
        get
        {
            return instance;
        }
    }
    private int monsterID = 0;
    public void AddMonster()
    {
        Monster monster = new Monster(monsterID);
        Console.WriteLine("创建了id为{0}怪物", monsterID);
        monsterID++;
        monstersTable.Add(monster.id, monster);
        
    }
    public void RemoveMonster(int monsterID) 
    { 
        if(monstersTable.ContainsKey(monsterID))
        {
            (monstersTable[monsterID] as Monster).Dead();
            monstersTable.Remove(monsterID);
        }
    }
}
class Monster
{
    public int id;
    public Monster(int id)
    {
        this.id = id;
    }
    public void Dead()
    {
        Console.WriteLine("怪物{0}死亡",id);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1662149.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

运营商的mpls专线

在当今高速发展的数字化时代&#xff0c;网络已成为企业发展不可或缺的基础设施。作为企业网络 连接的重要组成部分&#xff0c;MPLS专线在运营商的推动下逐渐成为了企业选择的首选。 MPLS&#xff08;Multi-Protocol Label Switching&#xff09;是一种基于标签的交换技术&am…

QT C++(QWidget类及其常见的属性)

文章目录 1. QWidget类及其常见的属性 1. QWidget类及其常见的属性 QT各种控件都是继承自QWidget类&#xff0c;QWidget类是QT控件体系中通用的部分。 QWidget属性如下图 常见的QT属性为&#xff1a; enabled&#xff1a;描述控件是否处于可用状态&#xff08;禁用状态这个…

ssrf学习2——内网ip绕过

环回地址绕过 尝试访问内网 也就是127.0.0.1里面的flag.php 但是如果真的去访问127.0.0.1/flag.php 还是不行 也就是说127.0.0.1被过滤了 进制转换 127.0.0.1是点分十进制 可以用二进制八进制十六进制来绕过过滤 0x7F000001/flag.php 017700000001/flag.php(八进制前面是…

Yolov8目标检测——在Android上部署Yolov8 tflite模型

1. 简介 YOLOv8 是一种用于目标检测的深度学习模型&#xff0c;它是 YOLO&#xff08;You Only Look Once&#xff09;系列的最新版本之一。YOLO 系列因其高效和准确性而在计算机视觉领域非常受欢迎&#xff0c;特别是在需要实时目标检测的应用中&#xff0c;如视频监控、自动…

docker搭建mysql集群实现主从复制

前言 随着业务的增长&#xff0c;一台数据服务器已经满足不了需求了&#xff0c;负载过重。这个时候就需要减压了&#xff0c;实现负载均衡和读写分离&#xff0c;一主一丛或一主多从。 主服务器只负责写&#xff0c;而从服务器只负责读&#xff0c;从而提高了效率减轻压力。 …

docker安装nginx支持ssl 实现https访问(完整版)

全文目录,一步到位 1.前言简介1.1 专栏传送门1.1.1 本文简介 2. docker安装nginx支持ssl2.0 准备ssl证书(例: 阿里云)2.0.1 配置域名解析2.0.2 找到数字证书管理服务并签发ssl证书2.0.3 选择默认证书 填写域名 创建2.0.4 提交审核, 签发成功2.0.5 解压并上传到宿主机ssl路径下 …

<网络安全>《83 微课堂<国家数据要素总体框架>》

1 总体框架 国家数据要素化总体框架由“六横两纵”共八个关键环节构成。 2 国家数据基础设施&#xff08;NDI&#xff09; 最底部第一层是国家数据基础设施&#xff08;NDI&#xff09;。国家数据基础设施&#xff08;NDI&#xff09;是经济社会进入数据要素化发展新阶段后新…

Vue面试经验2

Vue 你说你在vue项目中实现了自定义指令&#xff0c;如何实现 全局指令在main.js入口文件中实现 使用方法&#xff1a;v-指令名称 每个钩子函数都有两个参数&#xff08;ele,obj&#xff09; ele:绑定指令的元素 obj:指令的一些信息&#xff08;比如绑定指令的值&#xff0c…

Python Pendulum:用代码提升您的时间管理技能

更多Python学习内容&#xff1a;ipengtao.com Python中的Pendulum库是一个强大的日期和时间处理工具&#xff0c;提供了丰富的功能和灵活的接口&#xff0c;用于处理日期、时间、时区等相关操作。本文将全面介绍Pendulum库的主要功能、使用方法和实际应用场景&#xff0c;并给出…

基于ESP32和ESP8266的物联网开发过程(二)

在做这个项目前&#xff0c;也做了一些调研。项目的初衷是想要用于智能家居。我比较了小米IoT、阿里云、ESPHOME、巴沙云、点灯科技和ONENET等几个平台。最终选择了Onenet&#xff0c;部分原因是之前用过它的多协议版本&#xff0c;但现在这个版本已经下线了。 小米IoT的公测名…

使用FFmpeg处理RTSP视频流并搭建RTMP服务器实现图片转直播全流程

目录 一、FFmpeg安装与配置教程二、搭建并配置Nginx RTMP服务器三、从RTSP视频流提取帧并保存为图片四、将图片序列转换为视频五、将视频推送为直播流六、将图片序列推送为直播流 在实时音视频领域&#xff0c;我们经常需要处理从各种源&#xff08;如摄像头&#xff09;获取的…

Java练手项目 个人学习等选题参考

难度系数说明&#xff1a; 难度系数用来说明项目本身进行分析设计的难度 难度系数大于1的项目是非常值得反复学习的&#xff0c;从项目中成长 前言 大家好&#xff0c;我是二哈喇子&#xff0c;此博文整理了各种项目需求 要从本篇文章下的项目中学习的思路&#xff1a; 用的…

【架构】MVC架构模式 三层架构

1 不使用MVC架构模式完成银行账户转账 <% page contentType"text/html;charsetUTF-8" language"java" %> <html><head><base href"${pageContext.request.scheme}://${pageContext.request.serverName}:${pageContext.request.…

[MRCTF2020]Ez_bypass1 and [网鼎杯 2020 青龙组]AreUSerialz1()php语言基础学习,以及序列化概念的基本了解

1.[MRCTF2020]Ez_bypass1 &#xff08;1&#xff09;打开环境后它是一串很长并且看起来非常混乱的代码&#xff0c;看不懂那咱就先不管&#xff0c;直接查看源码 &#xff08;2&#xff09;看了之后可以发现它涉及到很多东西 首先就是要进行一个仔细的代码审计&#xff0c;分…

网络基础-ICMP协议

ICMP&#xff08;Internet Control Message Protocol&#xff0c; Internet控制消息协议&#xff09; ICMP协议是IP协议的辅助协议&#xff0c;用于在IP网络上发送控制消息&#xff0c;它通常被用于诊断网络故障、执行网络管理任务以及提供一些错误报告&#xff1b;对于收集各…

XWiki 服务没有正确部署在tomcat中,如何尝试手动重新部署?

1. 停止 Tomcat 服务 首先&#xff0c;您需要停止正在运行的 Tomcat 服务器&#xff0c;以确保在操作文件时不会发生冲突或数据损坏&#xff1a; sudo systemctl stop tomcat2. 清空 webapps 下的 xwiki 目录和 work 目录中相关的缓存 删除 webapps 下的 xwiki 目录和 work …

回炉重造java----单列集合(List,Set)

体系结构: 集合主要分为两种&#xff0c;单列集合collection和双列集合Map&#xff0c;区别在于单列集合一次插入一条数据&#xff0c;而双列的一次插入类似于key-value的形式 单列集合collection 注:红色的表示是接口&#xff0c;蓝色的是实现类 ①操作功能: 增加: add()&am…

六级仔细阅读

画两到三个词&#xff0c;精准定位 要原文和同义都满足才选 先看题目&#xff0c;在看原文&#xff0c;不要先看选项 做不出答案就继续往下读&#xff0c;读出来了就不用继续读了 分清楚是问为什么还是是什么&#xff0c;是什么看前面&#xff0c;为什么看后面 不知道就优先…

三、配置带HybridCLR的ARCore开发环境

预告 本专栏将介绍如何使用这个支持热更的AR开发插件&#xff0c;快速地开发AR应用。 专栏&#xff1a; Unity开发AR系列 插件简介 通过热更技术实现动态地加载AR场景&#xff0c;简化了AR开发流程&#xff0c;让用户可更多地关注Unity场景内容的制作。 “EnvInstaller…”支…

Java JVM 浅析

为什么要有JVMJVM是什么&#xff1f;JVM的工作流程和组成部分JVM规范和JVM实现JVM原理详解 带着以上问题&#xff0c;我将尝试对JVM作出一些简单的介绍。 一、JVM 简介 在90年代初&#xff0c;软件开发面临一个大问题&#xff0c;即不同的操作系统和硬件架构要求开发不同的版本…