系统运维系列 Map集合的时间value值按照先后顺序排序

本文介绍了如何在Java中对Map的value值为时间字符串的Map进行排序。讲解了Map的四种主要实现类HashMap, Hashtable, LinkedHashMap和TreeMap的特点,并提供了使用Collections.sort()结合自定义Comparator实现Map按时间顺序排序的代码示例。通过将时间字符串转换为整数并比较,实现了Map值的正序或倒序输出。

1 前言
【在实际开发过程中可能会遇到这种场景-干货亲测有效】
Map中的value值是时间字符串形式,在输出的时候想按照时间先后的顺序倒序或者正序输出map中的值,遇到这种类似的问题可以按照本篇博客中的方法去做。

2 知识背景
【Map的分类】
java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap Hashtable LinkedHashMap 和TreeMap:
(1)Hashmap 是一个最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时取得数据的顺序完全随机;
(2)Hashtable与 HashMap类似,它继承自Dictionary类,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了 Hashtable在写入时会比较慢;
(3)LinkedHashMap 是HashMap的一个子类,保存了记录的插入顺序;
(4)TreeMap 继承AbstractMap实现NavigableMap和SortMap接口,NavigableMap接口继承SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。
PS:一般情况下,我们用的最多的是HashMap;如果按自然顺序或自定义顺序遍历键,那么TreeMap会更好;如果需要输出的顺序和输入的相同,那么用LinkedHashMap 可以实现。

3 实际问题
【代码参考】

//模拟环境
List<Map<String, Object>> testMaps = new ArrayList();
Map<String, Object> hashMap1 = new HashMap<>();
Map<String, Object> hashMap2 = new HashMap<>();
Map<String, Object> hashMap3 = new HashMap<>();
Map<String, Object> hashMap4 = new HashMap<>();
hashMap1.put("TIME_NAME", "2021-01-04 19:15:00");
hashMap2.put("TIME_NAME", "2021-01-04 19:18:00");
hashMap3.put("TIME_NAME", "2020-12-04 19:10:00");
hashMap4.put("TIME_NAME", "2020-01-05 14:00:00");
testMaps.add(hashMap1);
testMaps.add(hashMap2);
testMaps.add(hashMap3);
testMaps.add(hashMap4);
//排序
if (testMaps != null && testMaps.size() > 1) {
	Collections.sort(testMaps , new Comparator<Map<String, Object>>() {
	@Override
	 public int compare(Map<String, Object> o1, Map<String, Object> o2) {
	 //有个小bug需要调试修改
	  Integer o1Value = Integer.valueOf(o1.get("TIME_NAME").toString().replace(":", "").replace("-", "").replace(" ", "").substring(1, 12));
	  Integer o2Value = Integer.valueOf(o2.get("TIME_NAME").toString().replace(":", "").replace("-", "").replace(" ", "").substring(1, 12));
	
	  return o2Value.compareTo(o1Value);
	  }
   });
}

参考资料:
https://www.pianshen.com/article/85091247027/ JAVA中Map的分类和常见情况

### Java 缓存分页数据到 Redis 的实现方案 在 Java 应用中,将分页数据缓存到 Redis 是一种常见的优化策略,可以显著减少数据库的压力并提高查询性能。以下是几种实现方案及其优缺点分析。 #### 1. 使用字符串类型存储分页数据 通过将每一页的分页数据序列化为 JSON 字符串,并以键对的形式存储到 Redis 中。例如,键名为 `productList:page:<pageNumber>:limit:<pageSize>`[^1]。 ```java String key = "productList:page:" + pageNumber + ":limit:" + pageSize; String value = objectMapper.writeValueAsString(pageData); redisTemplate.opsForValue().set(key, value, expiration, TimeUnit.SECONDS); ``` - **优点**:实现简单,读取速度快。 - **缺点**:存在数据冗余问题。如果多页的数据有重叠部分(如第一页和第二页的部分内容相同),则会重复存储相同的记录。 #### 2. 使用 Hash 结构存储分页数据 Hash 结构允许将多个字段存储在一个键下,适合存储具有唯一标识的实体数据。可以通过以下方式实现: - 将每个实体的 ID 作为 Hash 的字段名。 - 将实体的序列化数据作为字段。 ```java for (Product product : productList) { String id = String.valueOf(product.getId()); String data = objectMapper.writeValueAsString(product); redisTemplate.opsForHash().put("productList", id, data); } ``` - **优点**:避免了数据冗余问题,更新单个实体时只需修改对应的字段。 - **缺点**:需要额外维护一个完整的 Hash 表,可能会增加内存占用[^2]。 #### 3. 使用 ZSet 实现分页 ZSet 是 Redis 提供的一种有序集合结构,支持按分数排序。可以通过以下方式实现分页: - 将每个实体的 ID 和排序字段(如时间戳或权重)存储到 ZSet 中。 - 使用 `ZRANGE` 或 `ZREVRANGE` 命令获取指定范围内的 ID 列表。 - 根据 ID 列表从 Hash 或其他数据结构中获取具体数据。 ```java // 存储到 ZSet redisTemplate.opsForZSet().add("productList:zset", productId, score); // 获取分页 ID 列表 Set<String> ids = redisTemplate.opsForZSet().range("productList:zset", start, end); // 根据 ID 获取具体数据 Map<String, String> products = redisTemplate.opsForHash().multiGet("productList", ids); ``` - **优点**:支持高效排序和分页查询,适合需要按特定顺序展示数据的场景[^2]。 - **缺点**:需要额外维护一个 ZSet 和 Hash 结构,增加了复杂度。 #### 4. 组合使用 ZSet 和 Hash 结合 ZSet 和 Hash 的优势,可以实现更灵活的分页缓存方案: - 使用 ZSet 存储排序后的 ID 列表。 - 使用 Hash 存储具体的实体数据。 ```java // 存储到 ZSet redisTemplate.opsForZSet().add("productList:zset", productId, score); // 存储到 Hash String data = objectMapper.writeValueAsString(product); redisTemplate.opsForHash().put("productList:hash", productId, data); // 查询分页数据 Set<String> ids = redisTemplate.opsForZSet().range("productList:zset", start, end); Map<String, String> products = redisTemplate.opsForHash().multiGet("productList:hash", ids); ``` - **优点**:兼具高效排序和低冗余的优点。 - **缺点**:需要维护两个数据结构,可能增加开发运维成本[^2]。 ### 总结 选择合适的缓存方案取决于具体的应用场景和需求。如果分页数据不需要排序且更新频率较低,可以优先考虑字符串类型的简单实现;如果需要支持高效排序和动态更新,则推荐使用 ZSet 和 Hash 的组合方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值