记录--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 ]

首先,我们将对象数组转换为 Map,以便快速查找。然后,我们使用 filter 方法来过滤符合条件的对象。

这里我们列举了一些使用SetMap的实用技巧,它们可以大大简化你的代码,并使你更有效地处理数据。SetMap是JavaScript中非常有用的数据结构,值得我们在编写代码时好好利用。

本文转载于:

https://juejin.cn/post/7225425984312328252

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 

16 个超级实用的 Java 工具类

阅读本文大概需要 4 分钟。
出处:alterem
juejin.im/post/5d4a25b351882505c105cc6e

在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使用技巧的主要内容,如果未能解决你的问题,请参考以下文章

分享10个超级实用的Python自动化脚本

分享10个超级实用事半功倍的 Python自动化脚本

分享10个超级实用事半功倍的 Python自动化脚本

❤️良心整理丨职场必备❤️10个超级实用的在线网站果断收藏

我掏空了书签,整理了 14 个超级实用的网站!

我掏空了书签,整理了 14 个超级实用的网站!