-
C#教程之NET 在一个数组中查找另一个数组所在起始位置(下标从0开始,未找到返回-1)
本站最新发布 C#从入门到精通
试听地址 https://www.xin3721.com/eschool/CSharpxin3721/
试听地址 https://www.xin3721.com/eschool/CSharpxin3721/
问题:
如果 search 在 dist 中顺序出现而不要求连续出现,那代码应该如何修改?如何计算这种匹配的可能性?
数组 search=[5,4,6],在数据 dist=[1,5,5,4,3,4,5,6]的起始位置是1
(因为dist下标{1,3,7}和下标{1,5,7}的元素都等于 search=[5,4,6],故有两种可能)
/// <summary> /// 如果 search 在 dist 中顺序出现而不要求连续出现,那代码应该如何修改?如何计算这种匹配的可能性? /// 例如: /// 数组 search=[5,4,6],在数据 dist=[1,5,5,4,3,4,5,6]的起始位置是1 /// (因为dist下标{1,3,7}和下标{1,5,7}的元素都等于 search=[5,4,6],故有两种可能) /// </summary> private static void indexOf() { var search = new int[] { 5, 4, 6 }; Console.WriteLine($"连续出现的数组:{string.Join("-", search)}"); var dist = new int[] { 1, 5, 5, 4, 3, 4, 5, 6 }; Console.WriteLine($"需要比对的数组:{string.Join("-", dist)}"); var dictionary = new Dictionary<object, List<int>>(); // 按照数组顺序初始化字典 foreach (var item in search) { dictionary.Add(item, new List<int>()); } // 把search中元素的下标记录下来 for (int i = 0; i < dist.Length; i++) { var key = dist[i]; if (Array.IndexOf(search, key) > -1) { if (dictionary.ContainsKey(key)) { dictionary[key].Add(i); } } } var group = new List<List<int>>(); Console.WriteLine("分组前:"); foreach (var key in dictionary.Keys) { Console.WriteLine($"Key:{key}\t下标集合:{string.Join("-", dictionary[key])}"); } Add(new List<int>(), -1, 0, search, dictionary, group); Console.WriteLine("分组后:"); foreach (var item in group) { Console.WriteLine($"下标集合:{string.Join("-", item)}"); } } /// <summary> /// 递归添加 /// </summary> /// <param name="list">需要添加的集合</param> /// <param name="parentKey">上一次的key,当前循环key要比上一次大</param> /// <param name="index">下标</param> /// <param name="search"></param> /// <param name="dictionary"></param> /// <returns></returns> private static void Add(List<int> list, int parentKey, int index, int[] search, Dictionary<object, List<int>> dictionary, List<List<int>> group) { if (search.Count() <= index) { // 匹配项超过数组长度,终止 group.Add(list); return; } // 当前下标的值 var key = search[index]; if (dictionary.ContainsKey(key)) { var itemList = dictionary[key]; // 循环值 for (int j = 0; j < itemList.Count(); j++) { var itemKey = itemList[j]; // 当前循环key要比上一次大 if (itemKey < parentKey) { return; } var clone = Clone(list); clone.Add(itemKey); Add(clone, itemKey, index + 1, search, dictionary, group); } } } /// <summary> /// 克隆 /// </summary> /// <param name="list"></param> /// <returns></returns> private static List<int> Clone(List<int> list) { var clone = new List<int>(); foreach (var item in list) { clone.Add(item); } return clone; }
栏目列表
最新更新
C# 添加、读取、删除Excel文档属性
NET 在一个数组中查找另一个数组所在起始
开发中常用的正则表达式
解决使用canvas生成含有微信头像的邀请海
C#调用RabbitMQ实现消息队列
常用正则表达式
【转载】C#中decimal保留2位有效小数
Winows上简单配置使用kafka(.net使用)
webpack4.x 从零开始配置vue 项目(二)基础
白话系列之实现自己简单的mvc式webapi框架
.Net Standard(.Net Core)实现获取配置信息
Linux PXE + Kickstart 自动装机
Shell 编程 基础
Shell 编程 条件语句
CentOS8-网卡配置及详解
Linux中LVM逻辑卷管理
1.数码相框-相框框架分析(1)
Ubuntu armhf 版本国内源
Linux中raid磁盘阵列
搭建简易网站
Dubbo(五):深入理解Dubbo核心模型Invok
vfp教程之VFP与Excel交互编程
vfp教程之在VFP中实现跟变式组合框及椭圆
SQL SERVER查询数据库所有表的大小,按照记
使用 SQL 服务器时,"评估期已过期"错
sql server无法连接本地服务器
使用sql语句创建表
VB操作Access数据库小记 ————————
access数据库远程连接
java web操作Access数据库