记录--10个超级实用的SetMap使用技巧
Posted 林恒
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记录--10个超级实用的SetMap使用技巧相关的知识,希望对你有一定的参考价值。
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助
Set是一种类似于数组的数据结构,但是它的值是唯一的,即Set中的每个值只会出现一次。Set对象的实例可以用于存储任何类型的唯一值,从而使它们非常适用于去重。
Map是一种键值对集合,其中每个键都是唯一的,可以是任何类型,而值则可以是任何类型。Map对象的实例可以用于存储复杂的对象,并且可以根据键进行快速的查找和访问。
以下是Set和Map的一些常用方法:
Set:
- new Set(): 创建一个新的Set对象
- add(value): 向Set对象中添加一个新的值
- delete(value): 从Set对象中删除一个值
- has(value): 检查Set对象中是否存在指定的值
- size: 获取Set对象中的值的数量
- clear(): 从Set对象中删除所有值
Map:
- new Map(): 创建一个新的Map对象
- set(key, value): 向Map对象中添加一个键值对
- get(key): 根据键获取Map对象中的值
- delete(key): 从Map对象中删除一个键值对
- has(key): 检查Map对象中是否存在指定的键
- size: 获取Map对象中的键值对数量
- clear(): 从Map对象中删除所有键值对
Set和Map是非常有用的数据结构,它们可以提高程序的性能和可读性,并且可以简化代码的编写。
Set
去重
使用 Set 可以轻松地进行数组去重操作,因为 Set 只能存储唯一的值。
const arr = [1, 2, 3, 1, 2, 4, 5]; const uniqueArr = [...new Set(arr)]; console.log(uniqueArr); // [1, 2, 3, 4, 5]
数组转换
可以使用 Set 将数组转换为不包含重复元素的 Set 对象,再使用 Array.from() 将其转换回数组。
const arr = [1, 2, 3, 1, 2, 4, 5]; const set = new Set(arr); const uniqueArr = Array.from(set); console.log(uniqueArr); // [1, 2, 3, 4, 5]
优化数据查找
使用 Set 存储数据时,查找操作的时间复杂度为 O(1),比数组的 O(n) 要快得多,因此可以使用 Set 来优化数据查找的效率。
const dataSet = new Set([1, 2, 3, 4, 5]); if (dataSet.has(3)) console.log(\'数据已经存在\'); else console.log(\'数据不存在\');
并集、交集、差集
Set数据结构可以用于计算两个集合的并集、交集和差集。以下是一些使用Set进行集合运算的示例代码:
const setA = new Set([1, 2, 3]); const setB = new Set([2, 3, 4]); // 并集 const union = new Set([...setA, ...setB]); console.log(union); // Set 1, 2, 3, 4 // 交集 const intersection = new Set([...setA].filter(x => setB.has(x))); console.log(intersection); // Set 2, 3 // 差集 const difference = new Set([...setA].filter(x => !setB.has(x))); console.log(difference); // Set 1
模糊搜索
Set 还可以通过正则表达式实现模糊搜索。可以将匹配结果保存到 Set 中,然后使用 Array.from() 方法将 Set 转换成数组。
const data = [\'apple\', \'banana\', \'pear\', \'orange\']; // 搜索以 "a" 开头的水果 const result = Array.from(new Set(data.filter(item => /^a/i.test(item)))); console.log(result); // ["apple"]
使用 Set 替代数组实现队列和栈
可以使用 Set 来模拟队列和栈的数据结构。
// 使用 Set 实现队列 const queue = new Set(); queue.add(1); queue.add(2); queue.add(3); queue.delete(queue.values().next().value); // 删除第一个元素 console.log(queue); // Set(2) 2, 3 // 使用 Set 实现栈 const stack = new Set(); stack.add(1); stack.add(2); stack.add(3); stack.delete([...stack][stack.size - 1]); // 删除最后一个元素 console.log(stack); // Set(2) 1, 2
Map
将 Map 转换为对象
const map = new Map().set(\'key1\', \'value1\').set(\'key2\', \'value2\'); const obj = Object.fromEntries(map);
将 Map 转换为数组
const map = new Map().set(\'key1\', \'value1\').set(\'key2\', \'value2\'); const array = Array.from(map);
记录数据的顺序
如果你需要记录添加元素的顺序,那么可以使用Map
来解决这个问题。当你需要按照添加顺序迭代元素时,可以使用Map
来保持元素的顺序。
const map = new Map(); map.set(\'a\', 1); map.set(\'b\', 2); map.set(\'c\', 3); map.set(\'d\', 4); for (const [key, value] of map) console.log(key, value); // Output: a 1, b 2, c 3, d 4
统计数组中元素出现次数
可以使用 Map 统计数组中每个元素出现的次数。
const arr = [1, 2, 3, 1, 2, 4, 5]; const countMap = new Map(); arr.forEach(item => countMap.set(item, (countMap.get(item) || 0) + 1); ); console.log(countMap.get(1)); // 2 console.log(countMap.get(2)); // 2 console.log(countMap.get(3)); // 1
统计字符出现次数
使用Map数据结构可以方便地统计字符串中每个字符出现的次数。
const str = \'hello world\'; const charCountMap = new Map(); for (let char of str) charCountMap.set(char, (charCountMap.get(char) || 0) + 1); console.log(charCountMap); // Map \'h\' => 1, \'e\' => 1, \'l\' => 3, \'o\' => 2, \' \' => 1, \'w\' => 1, \'r\' => 1, \'d\' => 1
缓存计算结果
在处理复杂的计算时,可能需要对中间结果进行缓存以提高性能。可以使用Map数据结构缓存计算结果,以避免重复计算。
const cache = new Map(); function fibonacci(n) if (n === 0 || n === 1) return n; if (cache.has(n)) return cache.get(n); const result = fibonacci(n - 1) + fibonacci(n - 2); cache.set(n, result); return result; console.log(fibonacci(10)); // 55
使用 Map 进行数据的分组
const students = [ name: "Tom", grade: "A" , name: "Jerry", grade: "B" , name: "Kate", grade: "A" , name: "Mike", grade: "C" , ]; const gradeMap = new Map(); students.forEach((student) => const grade = student.grade; if (!gradeMap.has(grade)) gradeMap.set(grade, [student]); else gradeMap.get(grade).push(student); ); console.log(gradeMap.get("A")); // [ name: "Tom", grade: "A" , name: "Kate", grade: "A" ]
使用 Map 过滤符合条件的对象
在实际开发中,我们常常需要在一个对象数组中查找符合某些条件的对象。此时,我们可以结合使用 Map 和 filter 方法来实现。比如:
const users = [ name: \'Alice\', age: 22 , name: \'Bob\', age: 18 , name: \'Charlie\', age: 25 ]; const userMap = new Map(users.map(user => [user.name, user])); const result = users.filter(user => userMap.has(user.name) && user.age > 20); console.log(result); // [ name: \'Alice\', age: 22 , name: \'Charlie\', age: 25 ]
16 个超级实用的 Java 工具类
在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类。
以下工具类、方法按使用流行度排名,参考数据来源于Github上随机选取的5万个开源项目源码。
一. org.apache.commons.io.IOUtils
-
closeQuietly:关闭一个IO流、socket、或者selector且不抛出异常,通常放在finally块
-
toString:转换IO流、 Uri、 byte[]为String
-
copy:IO流数据复制,从输入流写到输出流中,最大支持2GB
-
toByteArray:从输入流、URI获取byte[]
-
write:把字节. 字符等写入输出流
-
toInputStream:把字符转换为输入流
-
readLines:从输入流中读取多行数据,返回List<String>
-
copyLarge:同copy,支持2GB以上数据的复制
-
lineIterator:从输入流返回一个迭代器,根据参数要求读取的数据量,全部读取,如果数据不够,则失败
二. org.apache.commons.io.FileUtils
-
deleteDirectory:删除文件夹
-
readFileToString:以字符形式读取文件内容
-
deleteQueitly:删除文件或文件夹且不会抛出异常
-
copyFile:复制文件
-
writeStringToFile:把字符写到目标文件,如果文件不存在,则创建
-
forceMkdir:强制创建文件夹,如果该文件夹父级目录不存在,则创建父级
-
write:把字符写到指定文件中
-
listFiles:列举某个目录下的文件(根据过滤器)
-
copyDirectory:复制文件夹
-
forceDelete:强制删除文件
三. org.apache.commons.lang.StringUtils
-
isBlank:字符串是否为空 (trim后判断)
-
isEmpty:字符串是否为空 (不trim并判断)
-
equals:字符串是否相等
-
join:合并数组为单一字符串,可传分隔符
-
split:分割字符串
-
EMPTY:返回空字符串
-
trimToNull:trim后为空字符串则转换为null
-
replace:替换字符串
四. org.apache.http.util.EntityUtils
-
toString:把Entity转换为字符串
-
consume:确保Entity中的内容全部被消费。可以看到源码里又一次消费了Entity的内容,假如用户没有消费,那调用Entity时候将会把它消费掉
-
toByteArray:把Entity转换为字节流
-
consumeQuietly:和consume一样,但不抛异常
-
getContentCharset:获取内容的编码
五. org.apache.commons.lang3.StringUtils
-
isBlank:字符串是否为空 (trim后判断)
-
isEmpty:字符串是否为空 (不trim并判断)
-
equals:字符串是否相等
-
join:合并数组为单一字符串,可传分隔符
-
split:分割字符串
-
EMPTY:返回空字符串
-
replace:替换字符串
-
capitalize:首字符大写
六. org.apache.commons.io.FilenameUtils
-
getExtension:返回文件后缀名
-
getBaseName:返回文件名,不包含后缀名
-
getName:返回文件全名
-
concat:按命令行风格组合文件路径(详见方法注释)
-
removeExtension:删除后缀名
-
normalize:使路径正常化
-
wildcardMatch:匹配通配符
-
seperatorToUnix:路径分隔符改成unix系统格式的,即/
-
getFullPath:获取文件路径,不包括文件名
-
isExtension:检查文件后缀名是不是传入参数(List<String>)中的一个
七. org.springframework.util.StringUtils
-
hasText:检查字符串中是否包含文本
-
hasLength:检测字符串是否长度大于0
-
isEmpty:检测字符串是否为空(若传入为对象,则判断对象是否为null)
-
commaDelimitedStringToArray:逗号分隔的String转换为数组
-
collectionToDelimitedString:把集合转为CSV格式字符串
-
replace 替换字符串
-
delimitedListToStringArray:相当于split
-
uncapitalize:首字母小写
-
collectionToDelimitedCommaString:把集合转为CSV格式字符串
-
tokenizeToStringArray:和split基本一样,但能自动去掉空白的单词
八. org.apache.commons.lang.ArrayUtils
-
contains:是否包含某字符串
-
addAll:添加整个数组
-
clone:克隆一个数组
-
isEmpty:是否空数组
-
add:向数组添加元素
-
subarray:截取数组
-
indexOf:查找某个元素的下标
-
isEquals:比较数组是否相等
-
toObject:基础类型数据数组转换为对应的Object数组
九. org.apache.commons.lang.StringEscapeUtils
-
参考十五:
org.apache.commons.lang3.StringEscapeUtils
十. org.apache.http.client.utils.URLEncodedUtils
-
format:格式化参数,返回一个HTTP POST或者HTTP PUT可用application/x-www-form-urlencoded字符串
-
parse:把String或者URI等转换为List<NameValuePair>
十一. org.apache.commons.codec.digest.DigestUtils
-
md5Hex:MD5加密,返回32位字符串
-
sha1Hex:SHA-1加密
-
sha256Hex:SHA-256加密
-
sha512Hex:SHA-512加密
-
md5:MD5加密,返回16位字符串
十二. org.apache.commons.collections.CollectionUtils
-
isEmpty:是否为空
-
select:根据条件筛选集合元素
-
transform:根据指定方法处理集合元素,类似List的map()
-
filter:过滤元素,类似List的filter()
-
find:基本和select一样
-
collect:和transform 差不多一样,但是返回新数组
-
forAllDo:调用每个元素的指定方法
-
isEqualCollection:判断两个集合是否一致
十三. org.apache.commons.lang3.ArrayUtils
-
contains:是否包含某个字符串
-
addAll:添加整个数组
-
clone:克隆一个数组
-
isEmpty:是否空数组
-
add:向数组添加元素
-
subarray:截取数组
-
indexOf:查找某个元素的下标
-
isEquals:比较数组是否相等
-
toObject:基础类型数据数组转换为对应的Object数组
十四. org.apache.commons.beanutils.PropertyUtils
-
getProperty:获取对象属性值
-
setProperty:设置对象属性值
-
getPropertyDiscriptor:获取属性描述器
-
isReadable:检查属性是否可访问
-
copyProperties:复制属性值,从一个对象到另一个对象
-
getPropertyDiscriptors:获取所有属性描述器
-
isWriteable:检查属性是否可写
-
getPropertyType:获取对象属性类型
十五. org.apache.commons.lang3.StringEscapeUtils
-
unescapeHtml4:转义html
-
escapeHtml4:反转义html
-
escapeXml:转义xml
-
unescapeXml:反转义xml
-
escapeJava:转义unicode编码
-
escapeEcmaScript:转义EcmaScript字符
-
unescapeJava:反转义unicode编码
-
escapeJson:转义json字符
-
escapeXml10:转义Xml10
这个现在已经废弃了,建议使用commons-text包里面的方法。
十六. org.apache.commons.beanutils.BeanUtils
-
copyPeoperties:复制属性值,从一个对象到另一个对象
-
getProperty:获取对象属性值
-
setProperty:设置对象属性值
-
populate:根据Map给属性复制
-
copyPeoperty:复制单个值,从一个对象到另一个对象
-
cloneBean:克隆bean实例
现在你只要了解了以上16种最流行的工具类方法,你就不必要再自己写工具类了,不必重复造轮子。
大部分工具类方法通过其名字就能明白其用途,如果不清楚的,可以看下别人是怎么用的,或者去网上查询其用法。
另外,工具类,根据阿里开发手册,包名如果要使用util不能带s,工具类命名为 XxxUtils。
·END·
程序员的成长之路
路虽远,行则必至
本文原发于 同名微信公众号「程序员的成长之路」,回复「1024」你懂得,给个赞呗。
回复 [ 520 ] 领取程序员最佳学习方式
回复 [ 256 ] 查看 Java 程序员成长规划
?
以上是关于记录--10个超级实用的SetMap使用技巧的主要内容,如果未能解决你的问题,请参考以下文章