深入解析Java中List和Map的多层嵌套与拆分

深入解析Java中List和Map的多层嵌套与拆分

  • 深入解析Java中List和Map的多层嵌套与拆分技巧 📝
    • 摘要
    • 引言
    • 正文内容
      • 什么是嵌套数据结构?
        • 例子:
      • 遍历嵌套List和Map
        • 遍历嵌套List
        • 遍历嵌套Map
      • 拆分嵌套数据结构
        • 拆分嵌套List
        • 拆分嵌套Map
      • 🤔 QA环节
      • 小结
      • 表格总结
      • 总结
      • 未来展望
      • 参考资料

在这里插入图片描述

博主 默语带您 Go to New World.
个人主页—— 默语 的博客👦🏻
《java 面试题大全》
《java 专栏》
🍩惟余辈才疏学浅,临摹之作或有不妥之处,还请读者海涵指正。☕🍭
《MYSQL从入门到精通》数据库是开发者必会基础之一~
🪁 吾期望此文有资助于尔,即使粗浅难及深广,亦备添少许微薄之助。苟未尽善尽美,敬请批评指正,以资改进。!💻⌨


深入解析Java中List和Map的多层嵌套与拆分技巧 📝

摘要

作为一个默语博主,我经常收到读者关于如何在Java中处理多层嵌套数据结构的问题。特别是对于List和Map的多层嵌套、拆分和重组,许多开发者感到困惑。在这篇文章中,我们将深入探讨这些问题,提供详细的代码示例,并分享一些实用的技巧,帮助你在这方面取得突破。关键搜索词:Java嵌套List、Java嵌套Map、Java数据结构处理。

引言

在Java开发中,处理复杂的嵌套数据结构是一项基本但至关重要的技能。无论是处理来自API的JSON数据还是构建复杂的数据模型,理解如何有效地嵌套、拆分和重组List和Map是每个Java开发者都应该掌握的。本篇博客将详细探讨这些概念,并通过丰富的代码示例帮助你理解和应用这些技巧。

正文内容

什么是嵌套数据结构?

嵌套数据结构是指一个数据结构内部包含另一个数据结构。例如,一个List中的元素也是List,或者一个Map中的值是另一个Map。这种结构在处理复杂数据时非常有用,但也增加了处理的难度。

例子:
List<List<Integer>> nestedList = Arrays.asList(
    Arrays.asList(1, 2, 3),
    Arrays.asList(4, 5),
    Arrays.asList(6, 7, 8, 9)
);

Map<String, Object> nestedMap = new HashMap<>();
nestedMap.put("name", "Alice");
nestedMap.put("details", Map.of(
    "age", 30,
    "address", Map.of(
        "city", "Wonderland",
        "zip", "12345"
    )
));

遍历嵌套List和Map

遍历嵌套数据结构是理解和处理它们的第一步。我们可以使用递归函数来实现这一点。

遍历嵌套List
public void printNestedList(List<?> nestedList) {
    for (Object element : nestedList) {
        if (element instanceof List) {
            // 如果元素是一个List,则递归调用自己
            printNestedList((List<?>) element);
        } else {
            // 否则,直接打印该元素
            System.out.println(element);
        }
    }
}

// 测试
List<List<Object>> nestedList = Arrays.asList(
    Arrays.asList(1, 2, Arrays.asList(3, 4)),
    Arrays.asList(5, Arrays.asList(6, Arrays.asList(7, 8))),
    Arrays.asList(9)
);
printNestedList(nestedList);

在这个例子中,printNestedList 方法接收一个嵌套的List,通过递归调用自身来处理List中的每个元素。如果元素是一个List,则再次调用自身;否则,直接打印该元素。

遍历嵌套Map
public void printNestedMap(Map<String, Object> nestedMap) {
    for (Map.Entry<String, Object> entry : nestedMap.entrySet()) {
        if (entry.getValue() instanceof Map) {
            // 如果值是一个Map,则递归调用自己
            printNestedMap((Map<String, Object>) entry.getValue());
        } else {
            // 否则,直接打印键和值
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}

// 测试
Map<String, Object> nestedMap = new HashMap<>();
nestedMap.put("name", "Alice");
nestedMap.put("details", Map.of(
    "age", 30,
    "address", Map.of(
        "city", "Wonderland",
        "zip", "12345",
        "location", Map.of(
            "latitude", "52.1234N",
            "longitude", "0.1234W"
        )
    )
));
printNestedMap(nestedMap);

在这个例子中,printNestedMap 方法接收一个嵌套的Map,通过递归调用自身来处理Map中的每个条目。如果值是一个Map,则再次调用自身;否则,直接打印键和值。

拆分嵌套数据结构

拆分嵌套数据结构是将复杂的数据结构分解为更简单的部分,从而更容易处理和理解。

拆分嵌套List

将嵌套List拆分为一维List:

public List<Object> flattenList(List<?> nestedList) {
    List<Object> flatList = new ArrayList<>();
    for (Object element : nestedList) {
        if (element instanceof List) {
            // 如果元素是一个List,则递归调用自己并将结果添加到flatList中
            flatList.addAll(flattenList((List<?>) element));
        } else {
            // 否则,直接将元素添加到flatList中
            flatList.add(element);
        }
    }
    return flatList;
}

// 测试
List<List<Object>> nestedList = Arrays.asList(
    Arrays.asList(1, 2, Arrays.asList(3, 4)),
    Arrays.asList(5, Arrays.asList(6, Arrays.asList(7, 8))),
    Arrays.asList(9)
);
List<Object> flatList = flattenList(nestedList);
System.out.println(flatList);

在这个例子中,flattenList 方法接收一个嵌套的List,通过递归调用自身将嵌套List中的所有元素添加到一个新的一维List中。

拆分嵌套Map

将嵌套Map拆分为简单的键值对:

public Map<String, Object> flattenMap(Map<String, Object> nestedMap, String parentKey) {
    Map<String, Object> flatMap = new HashMap<>();
    for (Map.Entry<String, Object> entry : nestedMap.entrySet()) {
        String newKey = parentKey.isEmpty() ? entry.getKey() : parentKey + "." + entry.getKey();
        if (entry.getValue() instanceof Map) {
            // 如果值是一个Map,则递归调用自己并将结果添加到flatMap中
            flatMap.putAll(flattenMap((Map<String, Object>) entry.getValue(), newKey));
        } else {
            // 否则,直接将键值对添加到flatMap中
            flatMap.put(newKey, entry.getValue());
        }
    }
    return flatMap;
}

// 测试
Map<String, Object> nestedMap = new HashMap<>();
nestedMap.put("name", "Alice");
nestedMap.put("details", Map.of(
    "age", 30,
    "address", Map.of(
        "city", "Wonderland",
        "zip", "12345",
        "location", Map.of(
            "latitude", "52.1234N",
            "longitude", "0.1234W"
        )
    )
));
Map<String, Object> flatMap = flattenMap(nestedMap, "");
System.out.println(flatMap);

在这个例子中,flattenMap 方法接收一个嵌套的Map和一个父键,通过递归调用自身将嵌套Map中的所有键值对添加到一个新的Map中,其中键表示嵌套路径。

🤔 QA环节

问:如何处理嵌套数据结构中的null值?

答:在处理嵌套数据结构时,务必检查每个元素或值是否为null。如果遇到null值,可以选择忽略、记录或根据具体需求进行处理。例如:

public void printNestedListWithNullHandling(List<?> nestedList) {
    for (Object element : nestedList) {
        if (element == null) {
            System.out.println("null");
        } else if (element instanceof List) {
            printNestedListWithNullHandling((List<?>) element);
        } else {
            System.out.println(element);
        }
    }
}

// 测试
List<List<Object>> nestedListWithNulls = Arrays.asList(
    Arrays.asList(1, null, Arrays.asList(3, null)),
    Arrays.asList(null, Arrays.asList(6, Arrays.asList(null, 8))),
    Arrays.asList(9, null)
);
printNestedListWithNullHandling(nestedListWithNulls);

小结

通过本文,我们深入探讨了Java中List和Map的多层嵌套与拆分技巧。通过递归函数和适当的检查,我们可以高效地处理这些复杂的数据结构。

表格总结

技巧方法示例代码
遍历嵌套List递归遍历printNestedList
遍历嵌套Map递归遍历printNestedMap
拆分嵌套List递归拆分flattenList
拆分嵌套Map递归拆分flattenMap

总结

在Java中处理多层嵌套的List和Map是一个复杂

但非常重要的技能。通过理解并应用本文中介绍的技巧,你将能够更高效地处理复杂的数据结构,提高代码的可读性和维护性。

未来展望

未来,我们可以探索更多高级的数据结构处理技巧,如流式处理、并行处理以及第三方库的使用,以进一步提升数据处理能力。

参考资料

  1. Java Documentation
  2. Effective Java by Joshua Bloch
  3. Java Tutorials - Nested Data Structures

希望这篇博客能够帮助你更好地理解和处理Java中的多层嵌套数据结构。如果有任何疑问或建议,欢迎在评论区留言,我们将一起讨论和学习!

在这里插入图片描述


🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥

如对本文内容有任何疑问、建议或意见,请联系作者,作者将尽力回复并改进📓;(联系微信:Solitudemind )

点击下方名片,加入IT技术核心学习团队。一起探索科技的未来,共同成长。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/672657.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【CTF Web】CTFShow web18 Writeup(文件包含漏洞+日志注入+RCE)

web18 1 阿呆加入了过滤&#xff0c;这下完美了。 解法 <?php if(isset($_GET[c])){$c$_GET[c];if(!preg_match("/php|file/i",$c)){include($c);}}else{highlight_file(__FILE__); } ?>用 dirsearch 扫了下&#xff0c;什么都没找到。 Wappalyzer 检测到 …

计算机视觉与模式识别实验1-3 图像滤波

文章目录 &#x1f9e1;&#x1f9e1;实验流程&#x1f9e1;&#x1f9e1;1. 对图像加入椒盐噪声&#xff0c;并用均值滤波进行过滤2.对图像加入高斯噪声&#xff0c;并用高斯滤波进行过滤3.对图像加入任意噪声&#xff0c;并用中值滤波进行过滤4.读入一张灰度图像&#xff0c;…

Java项目:95 springboot班级回忆录的设计与实现

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本管理系统有管理员和用户。 本海滨学院班级回忆录管理员功能有个人中心&#xff0c;用户信息管理&#xff0c;班委信息管理&#xff0c;班级信息管理…

云计算-高级云资源配置(Advanced Cloud Provisioning)

向Bucket添加公共访问&#xff08;Adding Public Access to Bucket&#xff09; 在模块5中&#xff0c;我们已经看到如何使用CloudFormation创建和更新一个Bucket。现在我们将进一步更新该Bucket&#xff0c;添加公共访问权限。我们在模块5中使用的模板&#xff08;third_templ…

多维数组找最大值

调用JavaScript的一个内置函数&#xff1a;Math.max() <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title…

汇编原理(二)寄存器——CPU工作原理

寄存器&#xff1a;所有寄存器都是16位&#xff08;0-15&#xff09;&#xff0c;可以存放两个字节 AX,BX,CX,DX存放一般性数据&#xff0c;称为通用寄存器 AX的逻辑结构。最大存放的数据为2的16次方减1。可分为AH和AL&#xff0c;兼容8位寄存器。 字&#xff1a;1word 2Byte…

c++实现:小型公司的信息管理系统(关于多态)

前言&#xff1a; 介绍员工信息&#xff1a;一个小型公司的人员信息管理系统 某小型公司&#xff0c;主要有四类人员&#xff1a;经理、技术人员、销售经理和推销员。现在&#xff0c;需要存储这些人员的姓名、编号、级别、当前薪水。计算月薪总额并显示全部信息人员编号基数为…

前端组件业务数据选择功能优雅写法

1. 业务场景 后台管理在实际业务中&#xff0c;经常可见的功能为&#xff1a;在当前的页面中从其他列表中选择数据。 例如&#xff0c;在一个商品活动列表页面中 需要选择配置的商品。 2. 遇到问题 从代码划分的角度来说&#xff0c;每个业务列表代码首先分散开来&#xff0…

基于Weaviate构建多模态检索和多模态检索增强(RAG): Building Multimodal Search and RAG

Building Multimodal Search and RAG 本文是学习 https://www.deeplearning.ai/short-courses/building-multimodal-search-and-rag/ 这门课的学习笔记。 What you’ll learn in this course Learn how to build multimodal search and RAG systems. RAG systems enhance an …

张大哥笔记:下一个风口是什么?

我们经常会问&#xff0c;下一个风口是什么&#xff1f;我们可以大胆预测一下&#xff0c;2024年的风口是什么呢&#xff1f; 40年前&#xff0c;如果你会开车&#xff0c;那就是响当当的铁饭碗&#xff1b; 30年前&#xff0c;如果你会英语和电脑&#xff0c;那也绝对是个人才…

SSMP整合案例第五步 在前端页面上拿到service层调数据库里的数据后列表

在前端页面上列表 我们首先看看前端页面 我们已经把数据传入前端控制台 再看看我们的代码是怎么写的 我们展示 数据来自图dataList 在这里 我们要把数据填进去 就能展示在前端页面上 用的是前端数据双向绑定 axios发送异步请求 函数 //钩子函数&#xff0c;VUE对象初始化…

RK3568笔记二十九:RTMP推流

若该文为原创文章&#xff0c;转载请注明原文出处。 基于RK3568的RTMP推流测试&#xff0c;此代码是基于勇哥的github代码修改的&#xff0c;源码地址MontaukLaw/3568_rknn_rtmp: rk3568的推理推流 (github.com) 感兴趣的可以clone下来测试。 也可以下载修改后的代码测试。Y…

VirtualBox Ubuntu系统硬盘扩容

1、关闭虚拟机&#xff0c;找到需要扩容的硬盘&#xff0c;修改为新的容量80GB&#xff0c;应用保存。 2、打开VM&#xff0c;进入系统&#xff0c;使用lsblk可以看到硬盘容量已经变为80GB&#xff0c;但硬盘根分区还没有扩容&#xff0c;使用df查看根文件系统也没有扩容。 [19…

Java八股文面试全套真题

Java八股文面试全套真题 一、Redis1.1、你在最近的项目中哪些场景使用了redis呢&#xff1f;1.2、缓存穿透1.3、布隆过滤器1.4、缓存击穿1.5、缓存雪崩1.6、redis做为缓存&#xff0c;mysql的数据如何与redis进行同步呢&#xff1f;&#xff08;双写一致性&#xff09;1.6.1、读…

微信小程序的服务调取

微信小程序的服务调取概述 微信小程序允许开发者通过网络请求与服务器进行交互&#xff0c;从而实现数据的上传和下载。这是通过小程序提供的API&#xff0c;如wx.request、wx.downloadFile、wx.uploadFile等来完成的。这些API使得小程序可以从远程服务器获取数据&#xff0c;…

打造智能化未来:智能运维系统架构解析与应用实践

在数字化转型的大背景下&#xff0c;智能运维系统成为了企业提升效率、降低成本、增强安全性的关键利器。本文将深入探讨智能运维系统的技术架构&#xff0c;介绍其核心要素和应用实践&#xff0c;帮助读者全面了解智能运维系统的概念、优势和应用价值。 ### 1. 智能运维系统的…

uniapp实现微信小程序调用云函数【vue3】

本人是从微信开发者工具写原生微信小程序一步一步走来&#xff0c;由于vue3框架的慢慢的步入前端市场&#xff0c;为了不被前端市场遗弃&#xff0c;果断从vue2开始步入vue3的学习&#xff0c;本人习惯在在HBuilder X写uniapp的项目&#xff0c;过去uniapp默认vue2框架&#xf…

MT3045 松鼠接松果

思路&#xff1a; 求x的一个区间&#xff0c;使区间中的松果的最大y坐标和最小y坐标的差至少为D。若有多个区间&#xff0c;则取最小的那个。 即使用单调队列不断维护最大值和最小值。 首先L固定不动&#xff0c;R不断右移&#xff1a; 即若函数f(R)max[L,R]-min[L,R] >…

Pytest框架中用例用例执行常用参数介绍

pytest 支持通过命令行参数来定制测试运行的方式。以下是一些常用的 pytest 执行参数介绍。 学习目录 -q 或 --quiet: 安静模式&#xff0c;只显示进度和摘要 -s : 选项允许在测试的输出中捕获 stdout 和 stderr。 -v : 选项会使 pytest 的输出更加详细。 -k &#xff1a;…

数据分析必备:一步步教你如何用Pandas做数据分析(15)

1、Pandas 数据丢失 Pandas 数据丢失的操作实例 在现实生活中&#xff0c;数据丢失始终是一个问题。机器学习和数据挖掘等领域在模型预测的准确性方面面临严重问题&#xff0c;因为缺少值会导致数据质量较差。在这些领域中&#xff0c;缺失值处理是使模型更准确和有效的主要重…