C#基础知识点总结(八)- 集合和特殊集合

2023-10-27

元素个数是动态的,就应使用集合类。大多数集合接口都可在System.Collections和System.Collections.Generie名称空间中找到。

详细可见:C# 集合(Collection) | 菜鸟教程 (runoob.com)

1. 列表(List<T>)

动态列表使用泛型类List<T>,元素个数是动态的,相当于数组的泛型类集合

1. 在泛型类List<T>中,必须为声明为列表的值指定类型(T必须有具体的类型,比如int,string等)

2. ArrayList是一个非泛型列表,它可以添加任意object类型作为其元素(比如int, string等),是动态数组(用法和List<T>相似)。动态数组(ArrayList)代表了可被单独索引的对象的有序集合。它基本上可以替代一个数组。但是,与数组不同的是,您可以使用索引在指定的位置添加和移除项目,动态数组会自动重新调整它的大小。它也允许在列表中进行动态内存分配、增加、搜索、排序各项。

3. 只读集合:AsReadOnly()集合不能修改

            //新建一个int类型的List
            var intList = new List<int>();
            var racList1 = new List<Racer>(10);
            var intList2 = new List<int>() { 1,2,8};

            //Add()方法添加一个元素
            intList.Add(5);
            racList1.Add(new Racer("APPLE", 3, 'F'));
            //AddRange()一次给集合添加多个元素,可以传递一个数组
            racList1.AddRange(new Racer[] { new Racer("APPLE", 3, 'F'),
            new Racer("blue", 5, 'M')});

            //Insert()方法可以在指定位置插入元素
            racList1.Insert(2, new Racer("blue", 5, 'M'));
            //InsertRange()插入大量元素
            racList1.InsertRange(3, new Racer[] { new Racer("APPLE", 3, 'F'),
            new Racer("blue", 5, 'M')});

            //访问元素,可以通过元素号
            Racer rac1 = racList1[2];
            for(int i = 0; i < racList1.Count(); i++)
            {
                Console.WriteLine(racList1[i]);
            }
            foreach(var r in racList1)
            {
                Console.WriteLine(r.name);
            }

            //删除元素,可以利用索引,也可以传递要删除的元素
            racList1.RemoveAt(3);
            racList1.Remove(racList1[1]);
            racList1.RemoveRange(4, 1);
            
            // 搜索:IndexOf(), LastIndexOf(),FindIndex(),FindLastIndex(),Find()和FindLast()
            
            //排序: Sort()使用快速排序算法,比较所有元素

            //使用Capacity可以获取和设置集合的容量
            intList.Capacity = 20;

            ArrayList al = new ArrayList();
            al.Add(45);
            al.Sort();

2. 队列(Queue)

queue队列先进先出,Enqueue()从队尾进队,Dequeue()从队头出队

            Queue q = new Queue();
            q.Enqueue('A');
            q.Enqueue('b');
            q.Enqueue('b');
            //不能指定哪个出队,只能默认从队头出队,每用一次Dequeue()就会出队一个元素
            q.Dequeue();

3. 栈

stack后进先出,Push()在栈中添加元素,Pop()获取最近添加的元素出栈

            Stack st = new Stack();
            st.Push("A");
            st.Push("B");
            st.Push("C");
            //栈不能指定哪个元素出栈,只能每次出栈刚进栈的元素
            st.Pop();

4. 链表

LinkedList<T>是一个双向链表,其元素指向它前面和后面的元素。

1. 链表优点:元素插入迅速

2. 链表缺点:元素只能一个接一个的访问,查找元素用时长

详细请见:C#集合之链表 - Ruby_Lu - 博客园 (cnblogs.com)

5. 有序列表

SortedList<TKey, TValue>按照键(TKey)给元素排序,这些键值对可以通过键和索引来访问

1. 只允许每个键有一个对应的值

2. TKey,和TValue可以使用任意类型

3. 有序列表在添加元素时就会自动的进行排序

4. 排序列表是数组和哈希表的组合。它包含一个可使用键或索引访问各项的列表。如果您使用索引访问各项,则它是一个动态数组(ArrayList),如果您使用键访问各项,则它是一个哈希表(Hashtable)。集合中的各项总是按键值排序。

            var sortlist = new SortedList<int, string>();
            sortlist.Add(1, "aaa");
            sortlist.Add(2, "bbb");
            //新添加一个元素
            sortlist[8] = "aaabbb";
            //存在的键,会将原先的值覆盖
            sortlist[2] = "888";      
            //键的索引可以取值
            var data = sortlist[2]; 
            //所有的键
            var keys = sortlist.Keys; 
            //所有的值
            var values = sortlist.Values;

6. 哈希表(Hashtable)

Hashtable 类代表了一系列基于键的哈希代码组织起来的键/值对。它使用来访问集合中的元素。

1. 当您使用访问元素时,则使用哈希表,而且您可以识别一个有用的键值。哈希表中的每一项都有一个键/值对。键用于访问集合中的项目。

            Hashtable ht = new Hashtable();
            ht.Add("001", "Zara Ali");

            if (ht.ContainsValue("Nuha Ali"))
            {
                Console.WriteLine("This student name is already in the list");
            }
            else
            {
                ht.Add("008", "Nuha Ali");
            }
            // 获取键的集合
            ICollection key = ht.Keys;

            foreach (string k in key)
            {
                Console.WriteLine(k + ": " + ht[k]);
            }

7. 字典

7.1 Dictionary<TKey, TValue>

Dictionary<TKey, TValue>允许按照某个键来访问元素,字典也称为映射或散列表

1. 根据TKey键值快速查找TValue值,也可以自由地添加和删除元素,但没有在内存中移动后续元素的性能开销

2. 任何键都必须是唯一的,不能为空引用null,若值为引用类型,则可以为空值。

3. Key和Value可以是任何类型(string,int,自定义类等)

            //创建及初始化
            Dictionary<int, string> myDictionary = new Dictionary<int, string>();
            //添加元素
            myDictionary.Add(1, "aaa");
            myDictionary.Add(2, "bbb");
            myDictionary.Add(3, "ccc");
            myDictionary.Add(4, "ddd");
            //通过Key查找元素
            if (myDictionary.ContainsKey(1))
            {
                Console.WriteLine("Key:{0},Value:{1}", "1", myDictionary[1]);
            }
            //通过KeyValuePair遍历元素
            foreach (KeyValuePair<int, string> kvp in myDictionary)
            {
                Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value);
            }
            //键 Keys 
            var key = myDictionary.Keys;
            //值 Valus
            var values = myDictionary.Values;
            //Remove方法移除指定的键值
            myDictionary.Remove(2);

7.2 Lookup<TKey, TValue>

Lookup<TKey, TValue>把键映射到一个值集合上,一个TKey对应多个TValue

1. Lookup<TKey, TValue>不能像一般的字典那样创建,而必须调用ToLookup()方法

            
            var racList1 = new List<Racer>(10); 
            racList1.Add(new Racer("APPLE", 3, 'F'));
            //AddRange()一次给集合添加多个元素,可以传递一个数组
            racList1.AddRange(new Racer[] { new Racer("APPLE", 3, 'F'),
            new Racer("blue", 5, 'M')});

            var lookuprac = racList1.ToLookup(r => r.age);
            //lookuprac[5]的方括号中的值要和ToLookup(r => r.age)中r用的值一样
            foreach (Racer r in lookuprac[5])
            {
                Console.WriteLine(r);
            }

7.3 有序字典

SortedDictionary<TKey, TValue>是一个二叉搜索树,元素根据键来排序。和字典使用大致一样,只不过有序字典会自动排序,字典不会排序

1. 和字典一样,键唯一

2. SortedList<Tkey,Tvalue>类使用的内存比SortedDictionary<Tkey,Tvalue>类少

3. SortedList<Tkey,Tvalue>类使用的内存比SortedDictionary<Tkey,Tvalue>类少

8.集

集:包含不重复元素的集合(集只包含唯一值)。HashSet<T>(包含不重复元素的无序列表)和SortedSet<T>(包含不重复元素的有序列表)

1. 主要被设计用来存储集合,做高性能集运算,例如两个集合求交集、并集、差集等

            //创建无序集HashSet,不能有重复否则会合并
            var myHashSet = new HashSet<int>() { 1, 2, 1, 4, 1, 6, 4, 6, 6, 6 };
            var myHashSet1 = new HashSet<int>() { 1, 2 };
            foreach (int i in myHashSet)  //输出1246
            {
                Console.Write(" " + i);
            }

            //创建有序集SortedSet,不能有重复,否则会合并
            var mySortedSet = new SortedSet<int>() { 7, 8, 9, 4, 1, 6 };

            //添加元素,如果添加的元素存在的话,忽略
            myHashSet.Add(1);     
            mySortedSet.Add(1);


            判断集是否为子集,返回bool值
            myHashSet1.IsSubsetOf(myHashSet);

            判断集是否为超集,返回bool值
            myHashSet.IsSupersetOf(myHashSet1);

            判断是否有交集,返回bool值
            myHashSet1.Overlaps(myHashSet1); 

            并集
            var myHashSet3 = new HashSet<int>(myHashSet1);
            myHashSet3.UnionWith(myHashSet1);
           

            将子集删除
            myHashSet3.ExceptWith(myHashSet1);//删除子集

9. 各集合性能(时间复杂度) 

10. 处理位(BitArray, BitVector32)

BitArray类可以重新设置大小,事先不知道位数时,则使用BitArray类,它可以包含非常多的位。

BitVector32结构是基于栈的,因此比较快,BitVector32结构仅包含32位,它们存储在一个整数中

10.1 BitArray

BitArray 类管理一个紧凑型的位值数组,它使用布尔值来表示,其中 true 表示位是开启的(1),false 表示位是关闭的(0)。

1. 当您需要存储位,但是事先不知道位数时,则使用点阵列(BitArray )。

2. 可使用整型索引从点阵列集合中访问各项,索引从零开始。

3. BitArray是引用类型

           // 创建两个大小为 8 的点阵列
            BitArray ba1 = new BitArray(8);
            BitArray ba2 = new BitArray(8);
            byte[] a = { 60 };
            byte[] b = { 13 };

            // 把值 60 和 13 存储到点阵列中
            ba1 = new BitArray(a);
            ba2 = new BitArray(b);

            // ba1 的内容
            Console.WriteLine("Bit array ba1: 60");
            for (int i = 0; i < ba1.Count; i++)
            {
                Console.Write("{0, -6} ", ba1[i]);
            }
            Console.WriteLine();

            // ba2 的内容
            Console.WriteLine("Bit array ba2: 13");
            for (int i = 0; i < ba2.Count; i++)
            {
                Console.Write("{0, -6} ", ba2[i]);
            }
            Console.WriteLine();


            BitArray ba3 = new BitArray(8);
            //位的和操作
            ba3 = ba1.And(ba2);

            // ba3 的内容
            Console.WriteLine("Bit array ba3 after AND operation: 12");
            for (int i = 0; i < ba3.Count; i++)
            {
                Console.Write("{0, -6} ", ba3[i]);
            }
            Console.WriteLine();

            //位的或操作
            ba3 = ba1.Or(ba2);
            // ba3 的内容
            Console.WriteLine("Bit array ba3 after OR operation: 61");
            for (int i = 0; i < ba3.Count; i++)
            {
                Console.Write("{0, -6} ", ba3[i]);
            }

 10.2 BitVector32

如果事先知道需要的位数,就可以使用BitVector32替代BitArray。

1. BitVector32是一个值类型,在整数栈上存储位,一个整数可以存储32位

            //新建
            var bits = new BitVector32(0X23);  //新建并赋值0x23,不设置默认为0
            //输出bits:00000000000000000000000000100011
            Console.WriteLine(bits.ToString());

            //掩码读取位
            //所谓掩码就是用0屏蔽不关心的位,用1凸显关心的位
            Console.WriteLine(bits[0]); //
            Console.WriteLine(bits[1]); //读取第1位->1-true
            Console.WriteLine(bits[2]); //读取第2位->1-true
            Console.WriteLine(bits[3]); //读取第1位和第2位->1、1-true
            Console.WriteLine(bits[4]); //读取第3位->0-false
            Console.WriteLine(bits[5]); //读取第1位和第3位->0、1->false
            Console.WriteLine(bits[0x23]); //读取第1、2、6位->1、1、1->true
            Console.WriteLine(bits[0x13]); //读第1、2、5位->1、1、0->false
            //综上所列,读取的掩码位数为1的话,就返回该位的值,
            //读取的掩码为1位以上的话,例如3、5、0x13\0x23的话,就返回对应位值的相与结果

            //创建要读取的掩码,实际上就是从1开始的2倍数列。1、2、4、8、16、32。。。
            int bit1 = BitVector32.CreateMask();     //创建掩码1、0001
            int bit2 = BitVector32.CreateMask(bit1); //创建掩码2、0010
            int bit3 = BitVector32.CreateMask(bit2); //创建掩码4、0100
            int bit4 = BitVector32.CreateMask(bit3); //创建掩码8、1000
            int bit5 = BitVector32.CreateMask(bit4); //创建掩码16、10000
            bits[bit1] = true; //通过掩码设置第1位
            bits[bit2] = false;//通过掩码设置第2位
            bits[bit3] = true; //通过掩码设置第3位
            bits[bit4] = false;//通过掩码设置第4位
            bits[bit5] = true; //通过掩码设置第5位
            Console.WriteLine(bits);

            //创建多位掩码
            //0xabcdef=00000000101010111100110111101111
            bits[0xabcddf] = true;
            Console.WriteLine(bits); //00000000101010111100110111111111

            //创建片段,可以将32个位按照需求分为多个片段,这样便可以访问具体片段的值

            /*
             * 下面参数中第一个参数oxfff指的是当前片段所要存储的最大数据。其目的有两个
             * 1、限制片段的最大值,保证存储数据的规范
             * 2、根据最大值可以分配合适的最小空间
             * 例如0xfff表示111111111111它就表示要占用12个位,所以片段划分就是12个位     
             */
            BitVector32.Section sectionA = BitVector32.CreateSection(0xfff); //创建片段

            /*
             * 相同的原理0xff表示11111111,共需要8个位,所以该片段分配8个位    
             */
            BitVector32.Section sectionB = BitVector32.CreateSection(0xff, sectionA); //创建片段,占8位

            BitVector32.Section sectionC = BitVector32.CreateSection(0xf, sectionB); //创建片段,占4位

            BitVector32.Section sectionD = BitVector32.CreateSection(0x7, sectionC); //创建片段,占3位

            BitVector32.Section sectionE = BitVector32.CreateSection(0x7, sectionD); //创建片段,占3位

            BitVector32.Section sectionF = BitVector32.CreateSection(0x3, sectionE); //创建片段,占2位

            //此时bits:00  000  000  1010  10111100   110111111111
            //输出每个
            Console.WriteLine(sectionA);        //输出Section{0xfff,0x0}
            Console.WriteLine(bits[sectionA]);  //3583->110111111111
            Console.WriteLine(bits[sectionB]);  //188->10111100
            Console.WriteLine(bits[sectionC]);  //10->1010
            Console.WriteLine(bits[sectionD]);  //0->000 
            Console.WriteLine(bits[sectionE]);  //0->000
            Console.WriteLine(bits[sectionF]);  //0->00

11. 可观察的集合

ObservableCollection<T>:如果需要集合中的元素何时删除或添加信息

1. 动态数据集合并且当集合中新增、修改或者删除项目时,或者集合被刷新时,都有通知机制(通过实现接口INotifyCollectionChanged)

2. INotifyCollectionChanged它不是集合,只是一个接口。在类中提供一个事件PropertyChanged,当属性的值发生改变时通知客户端。如果对象的状态发生改变时(新增、修改、删除)将触发事件PropertyChange指向那些已经发生改变的集合

3. WPF 提供 ObservableCollection 类,它是实现 INotifyCollectionChanged 接口的数据集合的内置实现

4. 用法和List<T>类似

12. 不变的集合

不能改变的集合称为不变的集合。如果对象改变其状态,就很难在多个同时运行的任务中使用,这些集合必须同步。如果对象不能改变其状态,就很容易在多个线程中使用

1. 每次变化之后会生成一个新集合,同步所有多线程

2. 并不是真的一有变化就生成新的对象,在使用不变集合的每一个阶段,都没有复制完整的集合,而是使用了共享状态,仅在需要时复制集合。

            使用静态的Create方法创建该数组,Create方法被重载,可以传递任意数量的元素
            ImmutableArray<string> arr = ImmutableArray.Create<string>();
            Add 方法不会改变不变集合本身,而是返回一个新的不变集合
            ImmutableArray<string> arr1 = arr.Add("one");
            //可以一次调用多个Add方法
            ImmutableArray<string> arr2 = arr1.Add("two").Add("three");
            foreach (string i in arr2)
            {
                Console.WriteLine(i);
            }

13 并发集合

详细请见转载于:

C#并发集合 - HackerVirus - 博客园 (cnblogs.com)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#基础知识点总结(八)- 集合和特殊集合 的相关文章

  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 重载<<的返回值

    include
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

  • Android备忘录模式实现及源代码解析

    Android备忘录模式实现及源代码解析 备忘录模式是一种行为设计模式 它允许在不破坏封装性的前提下捕获对象的内部状态 并在需要时恢复 在Android开发中 备忘录模式可以用于保存和恢复应用程序的状态或数据 本文将介绍如何在Android
  • Docker 中 mysql问题解决

    1 Docker 中mysql问题 1 1 docker 中 安装mysql之后表明大小写不敏感 参考文章 mysql表名大小不敏感 1 1 1 进入mysql docker exec it dokcer中mysql容器名称 bash 下面
  • idea连接mysql设置时区

    当连接mysql时出现以下问题 那么到Advanced中设置时区为 Asia Shanghai 连接成功
  • 图像识别(四)

    大家好啊 我是董董灿 导读 图像识别 一 从像素说起 图像识别 二 图像的色彩空间 图像识别 三 初识卷积 上一篇文章 初识卷积 聊到了卷积这一算法 通俗点讲 卷积就是模仿的人眼识图的过程 以 感受野 的视角去扫描图片 从而获取不同区域的图
  • ThinkCMF后台页面模板demo

    index列表页面模板
  • 高效经验分享:怎么制作企业微信小程序

    随着移动互联网的发展 微信已经成为了人们生活中必不可少的社交媒体平台 同时也逐渐成为了企业推广的重要渠道之一 企业微信小程序是在微信平台上的一种轻量级应用程序 不仅可以方便用户在微信中进行业务操作 还可以提供更加精细化的服务和用户体验 那么
  • 过滤器配置问题(/和/*的区别)

    表单form jsp
  • 语义分割研究现状

    以语义分割热门的数据集Cityscapes的精度作为参考 比较当前语义分割网络效果 可以通过ICNet中的这张图来说明目前大多数方法的精度以及速度 目前MIOU超过80的有PSPNet ResNet38 PSPNet DUC 以及DANet
  • E: Couldn't create temporary file to work with /var/lib/apt/lists/ports.ubuntu.com_ubuntu-ports_dist

    E Couldn t create temporary file to work with var lib apt lists ports ubuntu com ubuntu ports dists trusty Release mkste
  • 解决Echarts与R的可视化中,横坐标显示不全的问题

    解决Echarts与R的可视化中 横坐标显示不全的问题 在做可视化的过程中 最烦的就是图做出来了 坐标显示不全的问题 接下来介绍两个解决问题的方法 在做可视化的过程中 最烦的就是图做出来了 坐标显示不全的问题 接下来介绍两个解决问题的方法
  • 数据可视化清新版【chart.js】学习笔记9.0—气泡图(Bubble Chart)

    Bubble Chart 气泡图 气泡图用于同时显示三维数据 气泡的位置由前两个维度以及相应的水平和垂直轴线确定 第三个维度由单个气泡的大小来表示 官方文档 https www chartjs org docs latest charts
  • PHP也能实现区块链?

    引言 什么是区块链 官方的解释是 区块链是一个分布式记账系统 是藉用密码学串接并保护其内容的串连交易记录 又称区块 每一个区块包含了前一个区块的加密散列 对应的时间戳记以及交易数据 通常用默克尔树算法计算的散列值表示 这样的设计使得区块内容
  • Java的List集合根据实体类的属性去重数据

    一 Stream流去重 创建一个包含DeptEntity对象的List 并向其中添加若干元素 List
  • 想月入过万?不妨试试Python爬虫

    上班打工不给力 打工人需要PlanB 敢问当代年轻人谁没动过搞副业的念头呢 ChatGPT的横空出世 更是让担心饭碗不保的年轻人把搞副业提上了日程 在哪个城市搞副业最卷 副业在网上炒的火热 实际上能不能挣到钱 哪个副业才是能月入过万的 财富
  • 惊群效应及其解决方法

    这里写目录标题 惊群效应的概念 惊群效应的解决方法 在accept之前加锁 SO REUSEPORT 惊群效应的概念 惊群现象就是多进程 多线程 在同时阻塞等待同一个事件的时候 休眠状态 如果等待的这个事件发生 那么他就会唤醒等待的所有进程
  • Python游戏开发 unit05_Pygame物体移动和边界碰撞

    一 移动的本质 物体的位置变化 其实是坐标的变化 循环一次 刷新画布 重新绘制 二 边界的碰撞反弹 左边 x lt 0 右边 x gt 窗口宽度 物体宽度 上边 y lt 0 下边 y gt 窗口高度 物体高度 三 完整代码演示 impor
  • 总结Python的几点语言特性

    总结Python的几点语言特性 Python语言简洁 优雅 扩展性强 这些特点常被Python程序员挂在嘴边 确实也都是Python的特点 要讨论语言的特点或特性 可以得到很多不同的结论 有针对语言整体而言的特性 也有针对某一个应用领域的特
  • R语言解决三门问题(ggplot可视化)

    三门问题背景介绍 三门问题 Monty Hall problem 亦称为蒙提霍尔问题 蒙特霍问题或蒙提霍尔悖论 大致出自美国的电视游戏节目Let s Make a Deal 问题名字来自该节目的主持人蒙提 霍尔 Monty Hall 参赛者
  • 德鲁克《卓有成效的管理者》学习&读书-总结

    有幸学习了管理大师德鲁克先生的 卓有成效的管理者 帮助学习者理清了在理论和实践之间建立桥梁 使其生根落地 开花结果 管理不是常识 管理是个实践学科 要不断温习 不断与领导同事联接 交流碰撞 不断的在事上练 所谓卓有成效 就是不断让优秀的习惯
  • C#基础知识点总结(八)- 集合和特殊集合

    元素个数是动态的 就应使用集合类 大多数集合接口都可在System Collections和System Collections Generie名称空间中找到 详细可见 C 集合 Collection 菜鸟教程 runoob com 1 列