ord函数:返回字符对应的ASCII码 格式: ord('字符串') 说明:函数返回值类型为 int 类型
解释: ord() 函数以一个字符(长度为1的字符串)作为参数,返回该一个长度的字符串所对应的 ASCII 数值,或者 Unicode 数值。(返回值是其字符串对应的十进制整数)
实例1:可以理解为 ord 函数是为了获取某字符的索引数而出生的
print(ord('A')) # 字符A的ASCII码为65 print(ord('a')) # 字符a的ASCII码为97 print(ord(',')) # 英文符号,的ASCII码为97 print(ord('大')) # 字符大的Unicode数值为22843 print(ord(',')) # 中文符号,的Unicode数值为65292 实例2:如果 ord 函数的参数长度大于或等与2,则会引发 TypeError 异常
print(ord('ab')) # Traceback (most recent call last): # File /home/lshhu/PycharmProjects/pracetice/1.py, line 1, in <module> # print(ord('ab')) # TypeError: ord() expected a character, but string of length 2 found chr函数:返回字符ASCII码所对应的字符本身 格式: chr(十进制整数) 说明:函数用来返回整数i所对应的Unicode字符,参数i为整数,取值范围必须在【0 - 1114111(十六进制为 0x10FFFF)】之间,否则将引发ValueError错误。
1. 新建 CompareUnit.java package org.cs.base.utils.enm; /** * 时间比较单位枚举 * <p> * HOUR, //时 * <p> * MINUTE, //分 * <p> * SECOND //秒 * * @author admin * @since 2022-4-25 */ public enum CompareUnit { HOUR, //时 MINUTE, //分 SECOND //秒 } 2. 新建 CalendarUtils.java package org.cs.base.utils; import org.apache.log4j.Logger; import org.cs.base.utils.enm.CompareUnit; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import java.text.SimpleDateFormat; import java.util.Calendar; /** * 日期工具类 * * @author admin * @since 2022-04-25 */ public class CalendarUtils { private static Logger log = Logger.
原链接:https://www.zhihu.com/answer/1858690571
摘录的重点:
作者:程序喵大人链接:https://www.zhihu.com/question/26901409/answer/1858690571来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 无符号整数的错误使用() for (unsigned int i = 10; i >= 0; --i) { ... } 上面这段代码会发生什么? 会死循环,这里要注意下无符号整数的使用。
容器的size()返回类型是无符号整数 std::vector<int> vec; vec.push_back(1); for (auto idx = vec.size(); idx >= 0; idx--) { cout << ===== \n; } 这段代码依旧会出现死循环,原因参考上一条。
memcpy、memset只适用于POD结构 至于什么是POD类型,其实解释起来挺麻烦的,感兴趣的可以直接看cppreference的
C++ named requirements: PODTypeen.cppreference.com/w/cpp/named_req/PODType STL遍历删除时注意迭代器失效问题 void erase(std::vector<int> &vec, int a) { for (auto iter = vec.begin(); iter !
先来逼逼两句: 在实际开发中,经常需要将一组(不只一个)数据存储起来,以便后边的代码使用。在VBA中有使用数组,可以把多个数据存储到一起,通过数组下标可以访问数组中的每个元素。Python 中没有数组,但是加入了更加强大的列表(list)。下面就对列表的内置方法进行介绍。通过dir(list)可以查看列表的属性和内置方法。 print(dir(list)) Python学习交流Q群:660193417### ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'] 可以看出,列表有11个内置方法。 1 append()、extend()、insert()方法 2 clear()、remove()、pop()方法 3 count()、index()方法 4 sort()、reverse()方法 5 copy()方法 1 append()、extend()、insert()方法 list.append(obj) obj – 表示到添加到列表末尾的数据,它可以是单个元素,也可以是列表、元组等。
实例如下:
# 判断是不是入参字符串是否全英文 def judge_pure_english(keyword): @param keyword: 需要判断是否为纯英文的字符串 @return: all()函数:用于判断给定的可迭代参数 iterable 中的所有元素是否都为 TRUE:如果是返回 True,否则返回 False。 ord()函数以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值: 英文的ASCII码数值小于128 return all(ord(i) < 128 for i in keyword) # 判断是不是入参字符串为全中文 def judge_pur_chinese(keyword): 中文字符的编码范围为: u'\u4e00' -- u'\u9fff:只要在此范围内就可以判断为中文字符串 @param keyword: @return: # 定义一个需要删除的标点符号字符串列表 remove_chars = '[·’!\#$%&\'()#!()*+,-./:;<=>?\@,:?¥★、….>【】[]《》?“”‘’\[\\]^_`{|}~]+' # 利用re.sub来删除中文字符串中的标点符号 strings = re.sub(remove_chars, , keyword) # 将keyword中文字符串中remove_chars中包含的标点符号替换为空字符串 for ch in strings: if u'\u4e00' <= ch <= u'\u9fff': pass else: return False return True
制作报表过程中,我们经常会遇到需要从不同数据库中获取数据,这样报表制作起来也会比较方便。积木报表支持的数据库类型不仅包含关系型数据库,也包含非关系型数据库及国产数据。今天就让我们来看一下积木报表都支持哪些数据库吧。
1.关系型数据库 mysql5.7+、oracle11g、sqlserver2017、PostgreSQL等
2.国产数据库 达梦、人大金仓、神通等
3.nosql 数据库 Redis、MongoDB
4.详细说明 未提供脚本的数据库,可以参考 文档 自行转库。
5.使用方法 登录系统后,点击“SQL数据集” 添加数据集 选择所添加数据集 设计报表 将字段拖拽至设计表的单元格中即可。 报表效果 附录 更多体验
体验地址:http://jimureport.com/ 文档地址:http://report.jeecg.com/
要在MySQL中存储数据,就必须定义数据库和表结构(schema),这是一个主要的限制。为了应对这一点,从MySQL 5.7开始,MySQL支恃了JavaScript对象表示(JavaScriptObject Notation,JSON)数据类型。之前,这类数据不是单独的数据类型,会被存储为字符串。新的JSON数据类型提供了自动验证的JSON文档以及优化的存储格式。
JSON文档以二进制格式存储,它提供以下功能:
对文档元素的快速读取访问。 当服务器再次读取JSON文档时,不需要重新解析文本获取该值。 通过键或数组索引直接查找子对象或嵌套值,而不需要读取文档中的所有值。 一、创建数据 1.1 创建测试表 mysql> create table employees.emp_details ( -> emp_no int primary key, -> details json -> ); Query OK, 0 rows affected (0.17 sec) mysql> desc employees.emp_details; +---------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+---------+------+-----+---------+-------+ | emp_no | int(11) | NO | PRI | NULL | | | details | json | YES | | NULL | | +---------+---------+------+-----+---------+-------+ 2 rows in set (0.
一、概述 在学习ConcurrentSkipListMap之前,我们需要来了解一种随机化的数据结构:跳跃表(skip list)。
1. 跳跃表 在我们通常所使用到的数据结构中,使用最多的无外乎就是数组和链表,而数组和链表各自的优缺点也很明显:
数组的优点在于元素的查找,链表的优点在于添加或移除等操作;而对一个有序的数组而言,添加一个元素,可能需要移动大量的元素;而对于一个有序的链表而言,查找一个元素,又不能通过像在数组查找中使用二分查找,只能通过顺序遍历的方式进行。
而为了使链表查询的时候也有一个不错的性能,所以就出现了跳跃表(skip list)这种数据结构。
2. 介绍 我们以一个链表查询的小例子来介绍跳跃表,顺便介绍下跳跃表的一些属性。
2.1 第一步,构建链表 比如我们有如下一条有序的链表: 我们要查找其中为70的元素,正常情况下,我们需要从头到尾依次遍历匹配,所使用时间复杂度O(n),同样,插入一个元素并保持链表有序,需要先找到合适的插入位置,再执行插入,时间复杂度也是O(n)。那么如何在此基础上提高查询速度呢,毫无疑问,做索引。
2.2 第二步,添加索引 我们来对原有链表中的一些元素提取出来,作为索引节点。
这样遍历的时候我们先对上层的链表进行遍历,然后获取到元素或者确定元素范围后,再进行下一层的遍历就行了,这样就不用挨个进行比较了,类似于二分查找的方式。
比如查找元素70,上层依次比较10,30,60,80,然后发现70大于60这个节点,小于80这个节点,然后进入下一层进行遍历,这时候只需要遍历60,70即可获取到元素。
所以添加了这层索引节点之后,再查询的时候时间复杂度就是O(n/2),同理,我们可以不断的增加层数,来降低相应的时间复杂度,直到最上层只有两个元素为止,因为一个节点没有比较的意义。这样最终的时间复杂度就变为了O(logn)。其实这种操作和二分查找类似,通过索引来跳过大量的节点,从而提高查询的效率。
比如再添加一层索引:
最终的结构大致如下:
2.3 插入/删除 正常情况下,上层索引节点与下层链表的元素比例是1:2,但当链表插入或者删除之后,就很难维持这个比例了,所以跳跃表也不强制1:2的比例。
对于添加节点而言,当一些新节点添加之后,哪个节点需要添加为索引节点,以及建几层的索引,都是通过一种抛硬币的形式来决定的。那为什么要使用抛硬币这种方式呢?
因为跳跃表添加和删除的节点都不是固定位置的,很难用一种有效的算法来保证跳跃表的索引始终分配均匀。而随机抛硬币的方式虽然不能保证索引的绝对均匀分布,却可以让大体趋于均匀。
而对于删除节点的话,先遍历找到该节点,然后把该节点和节点对应的所有索引节点一并删除即可。如果某一层索引在删除后只剩下了一个节点,那么这整个一层就可以删掉。
3. 跳跃表总结 上面简单介绍了跳跃表的概念,接下来我们来简单总结下跳跃表:
跳跃表是通过多层链表来实现的,每层都是一个有序的链表; 跳跃表的最底层包含了所有的元素,其他层保存的是元素的索引节点; 跳跃表搜索,删除,插入元素的时间复杂度是O(log N); 跳跃表通过随机的抛硬币方式来决定新插入的节点是否提到上层作为索引节点; 跳跃表提高搜索效率的方式是通过空间换时间得到的。 二、ConcurrentSkipListMap ConcurrentSkipListMap是一个基于skip list实现的线程安全的有序存储的Map,默认情况下根据key的自然顺序进行排序,或者根据在Map进行创建时提供的比较器进行排序。同样,该类不允许key或者value为null。
1. 继承结构 public class ConcurrentSkipListMap<K,V> extends AbstractMap<K,V> implements ConcurrentNavigableMap<K,V>, Cloneable, Serializable { ConcurrentSkipListMap继承了AbstractMap,该抽象类提供了接口的一些常规实现;而继承了ConcurrentNavigableMap接口,该接口可以获取Map的某一部分元素或者子元素;另外,该类支持克隆和序列化操作。
2. 属性 来看一下它的常用属性:
/** * 最底层的头节点的索引 */ private static final Object BASE_HEADER = new Object(); /** * 最顶层头节点索引 */ private transient volatile HeadIndex<K,V> head; /** * 比较器,如果使用自然排序,该值为null */ final Comparator<?
1. 搭建分片集群 1.1 集群结构 分片集群需要的节点数量较多,这里我们搭建一个最小的分片集群,包含3个master节点,每个master包含一个slave节点,结构如下: 这里我们会在同一台虚拟机中开启6个redis实例,模拟分片集群,信息如下:
IP PORT 角色 10.193.193.141 7001 master 10.193.193.141 7002 master 10.193.193.141 7003 master 10.193.193.141 8001 slave 10.193.193.141 8002 slave 10.193.193.141 8003 slave 1.2 准备实例和配置 1.3 启动 1.4 创建集群 1.5 测试 2. 散列插槽 3. 集群伸缩 4. 故障转移 5. RedisTemplate访问分片集群
SELECT year_month_val, xun, flux, ROUND(@temp:=@temp+flux,4) AS yearVal FROM (SELECT year_month_val, xun, SUM(flux)flux FROM wrs_muw_plan WHERE manage_id = 568 AND year_month_val BETWEEN '2020-09-01' AND '2021-09-01' GROUP BY year_month_val, xun ORDER BY year_month_val ASC, field(xun,'上旬','中旬','下旬'))a,(SELECT @temp:=0)T