当前位置: 首页 > news >正文

核密度分析

一.算法介绍

核密度估计(Kernel Density Estimation)是一种用于估计数据分布的非参数统计方法。它可以用于多种目的和应用,包括:

  • 数据可视化:核密度估计可以用来绘制平滑的密度曲线或热力图,从而直观地表示数据的分布情况。它可以帮助我们观察数据集中的高密度区域、低密度区域以及变化趋势。
  • 异常检测:通过核密度估计,我们可以识别数据中的异常点或离群值。异常点通常表现为低密度区域或与其他数据点明显不同的区域。
  • 概率密度计算:核密度估计可以用于计算给定数值的概率密度。通过将新数据点带入核密度估计函数,可以估计出该点在数据分布中的密度。
  • 模式识别:核密度估计可以用于识别数据中的模式或聚类。通过观察密度最高的区域,可以推断数据的聚类情况或潜在的模式。
  • 预测建模:核密度估计可以用于构建概率模型,进而进行预测。例如,在分类问题中,可以使用核密度估计来估计每个类别的概率密度,然后根据新的数据点所属的密度来进行分类预测。

根据具体的应用需求,我们可以灵活地使用核密度估计来分析和理解数据集的特征和结构,可能的用途包括针对社区规划分析房屋密度或犯罪行为,或探索道路或公共设施管线如何影响野生动物栖息地。
每个点位可以设置 weight 字段赋予某些要素比其他要素更大的权重,该字段还允许使用一个点表示多个观察对象。例如,一个地址可以表示一栋六单元的公寓,或者在确定总体犯罪率时可赋予某些罪行比其他罪行更大的权重。

二.算法计算原理

本算法以四次核函数为基础,四次核函数的特点是具有平滑的曲线形状,具有较宽的窗口,对数据点的贡献在距离较远时会迅速减小。由于其平滑性和较大的支持范围,四次核函数在核密度估计中被广泛使用。

在这里插入图片描述

在核密度估计中,通过将核函数应用于每个数据点,并对所有数据点的贡献进行求和,可以计算出在每个位置上的密度估计值。四次核函数的结果可视为在核密度估计中每个位置的密度贡献权重。较大的结果表示该位置的密度较高,而较小或接近零的结果表示该位置的密度较低。
本算法中主要利用核密度公式计算空间范围内的核密度值,根据核密度值生成 png 或 jpg 格式的热力图,或者将整个空间切割成网格,用网格中心点参与核密度计算生成 geojson 文件,以供进一步空间探索分析。

    /***  计算单个核密度* @param radius 半径* @param dist 两点的距离* @param weight 权重* @return*/public static double computeKernel(double radius, double dist, double weight){return  (3 / Math.PI) * weight * Math.pow((1 - Math.pow(dist / radius,2)), 2);}

创新性说明:

  • 1.算法会自适应数据中的空间点位范围,此范围可根据参数bufferSize 设置缓冲区扩展,以获取数据范围外的点参与计算。
  • 2.根据空间范围每隔特定步长创建虚拟点位或划分网格,灵活性较高,步长越小则结果在地图分布上的精度越高,步长参数step(米) 可选,如果没有设置, 则默认在空间范围内自适应创建一百万左右虚拟点或网格。
  • 3.采用多线程的方式进行核密度计算,速度更快。
  • 4.可将结果值进行归一化处理,核密度计算出来的结果值主要用于观察数据分布,但是各个结果值之间相差范围较大,不易观察数据分布,归一化后能更清晰观察不同区域间的分布情况。
  • 5.可根据核密度值的大小根据不同需求生成热力图或 geojson 文件。可在geojson文件上做进一步探索。

三.算法程序

1. 核心流程代码

从csv中获取源数据点信息, 获取坐标范围,如果需要缓冲区, 则设置缓冲区, 获取步长长度(默认一百万个像素点或网格),然后根据核密度信息创建图片或geojson

        // 输入文件路径String inputPath ="D:\\测试数据.csv";// 输出文件路径String outPath ="D:\\测试数据.geojson";// String outPath ="D:\\测试数据.jpg";// 经度字段String lonKey = "lon";// 纬度字段String latKey = "lat";// 权重字段String weightKey = "";// 影响半径double radius = 300.0;// 缓冲区double bufferSize = 0.1;// 生成的网格长度(单位: 米)int step = 0;int type;if (outPath.endsWith("png") || outPath.endsWith("jpg")){type = 0;}else if (outPath.endsWith("geojson")){type = 1;}else {throw new RuntimeException("输出文件格式只能是 png、jpg 或者 geojson");}// 从csv中获取源数据点信息List<EntryPoint> entryPoints = EntryPoint.formatToEntryPoints(inputPath, lonKey, latKey, weightKey, radius);// 获取坐标范围double[] coordsScope = KernelUtils.getCoordsScope(entryPoints);// 如果需要缓冲区, 则设置缓冲区if (bufferSize != 0){coordsScope = KernelUtils.getBufferScope(coordsScope[0], coordsScope[1], coordsScope[2], coordsScope[3], bufferSize);}// 获取默认的步长长度, 默认一百万个像素点或网格if (step ==0){step = KernelUtils.getDefaultSize(coordsScope);}// 根据核密度信息创建图片或geojsonkernel(coordsScope, entryPoints, step, radius, type, outPath);
    /*** 核密度方法* @param coordsScope 坐标范围* @param entryPoints  从csv中获取源数据点信息* @param step 步长长度* @param radius 影响半径* @param type 输出文件类型*/public static void kernel(double[] coordsScope, List<EntryPoint> entryPoints, int step, double radius, int type, String path){// 获取网格坐标系的lon, lat的列表List<Double[]> coords = KernelUtils.getKennelPointCoords(coordsScope[0], coordsScope[1],coordsScope[2],coordsScope[3], step);Progress.progress( progress++);int width =  coords.get(0).length;int high = coords.get(1).length;if (type == 1){// 生产 geojson 网格结果generatorGridGeojson(coords, entryPoints, width-1, high-1, radius, path, step);}else {// 生产热力图图片generatorThermalMap(coords, entryPoints, width, high, radius, path, step);}}

2.创建面的 geojson 文件

    /***  根据核密度信息创建面的 geojson 文件* @param coords 虚拟数据点经纬度列表* @param entryPoints 数据点* @param width 横向点位数量* @param high 纵向点位数量* @param radius 影响半径*/public static void generatorGridGeojson(List<Double[]> coords, List<EntryPoint> entryPoints,int width, int high, double radius, String path, int step){// 获取所有中心点位的数据List<PixelPoint> pixelPoints = KernelUtils.getGridCenters(coords);// 进行核密度计算, 并记录受到影响的网格信息KernelResult kernelResult = kernelCompute(entryPoints, pixelPoints, width, high, radius);Double[][] matrix = kernelResult.getMatrix();Double max = kernelResult.getMax();Double min = kernelResult.getMin();// 生产面的 geojson 文件writeToFile(KernelUtils.jointGridGeojson(matrix, max, min, coords), path);System.out.println(String.format("计算完成, 生成 geojson 文件, 参与计算网格  %d 个, 受影响网格 %d 个, 相邻网格间距 %s 米",pixelPoints.size(), KernelUtils.effectiveGrid, step));}

3.热力图图片

    /*** 根据核密度信息创建热力图图片* @param coords 虚拟数据点经纬度列表* @param entryPoints 数据点* @param width 横向点位数量* @param high 纵向点位数量* @param radius 影响半径*/public static void generatorThermalMap(List<Double[]> coords, List<EntryPoint> entryPoints,int width, int high, double radius, String path, int step){// 获得所有点位List<PixelPoint> pixelPoints = KernelUtils.spliceKennelPoints(coords);// 进行核密度计算, 并记录受到影响的网格信息KernelResult kernelResult = kernelCompute(entryPoints, pixelPoints, width, high, radius);Double[][] matrix = kernelResult.getMatrix();Double max = kernelResult.getMax();Double min = kernelResult.getMin();// 生产热力图ImageGenerator.generatorImage(matrix, max, min, path);System.out.println(String.format("计算完成, 生成图片 像素: %d x  %d, 相邻像素点实际代表距离 %s 米", width, high, step));}

4.计算所有点位的核密度

    /*** 计算所有点位的核密度* @param entryPoints 数据点信息* @param pixelPoints 创建的虚拟像素点* @param radius 影响半径* @return*/public static KernelResult kernelCompute(List<EntryPoint> entryPoints, List<PixelPoint> pixelPoints, int width, int high, double radius){List<Double> values = new ArrayList<>();double affectLat = KernelUtils.getLatDist(radius);// 记录受到影响的网格Double[][] matrix = new Double[high][width];// 建立线程池ThreadPoolExecutor threadPool = new ThreadPoolExecutor(30, 30, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue(Integer.MAX_VALUE));// 线程等待计数器CountDownLatch countDownLatch = new CountDownLatch(pixelPoints.size());// 创建锁, 使计算数据具有线程间可见性Lock lock = new ReentrantLock();int stepPosition = pixelPoints.size() / 75;for (int i = 0; i < pixelPoints.size(); i++){PixelPoint pixelPoint = pixelPoints.get(i);Double kennelLon = pixelPoint.getLon();Double kennelLat = pixelPoint.getLat();threadPool.execute(() -> {// 开始计算每个网格受到其他所有点所影响的核密度double kernel = 0.0;for (int j = 0; j < entryPoints.size(); j++){EntryPoint entryPoint = entryPoints.get(j);double lon = entryPoint.getLon();double lat = entryPoint.getLat();if (Math.abs(lon - kennelLon) > entryPoint.getAffectLon() || Math.abs(lat - kennelLat) > affectLat){continue;}// 获取权重, 默认为 1.0double weight = 1.0;if (entryPoint.getWeight() != null){weight = entryPoint.getWeight();}// 计算网格中心点与源数据点的距离double distance = KernelUtils.getDistance(lon, lat, kennelLon, kennelLat);// 影响半径大于距离的点直接去掉if (distance <= radius){// 计算每个网格所受影响的核密度kernel += computeKernel(radius, distance, weight);}}lock.lock();// 为中心点实体类赋予核密度的值Double value = 1 / Math.pow(radius, 2) * kernel;matrix[pixelPoint.getI()][pixelPoint.getJ()] = value;values.add(value);lock.unlock();countDownLatch.countDown();if (countDownLatch.getCount() % stepPosition == 0 && progress < 80){Progress.progress(progress++);}});}// 等待所有任务执行完毕try {countDownLatch.await();} catch (InterruptedException e) {throw new RuntimeException(e);}// 关闭线程池threadPool.shutdown();return  new KernelResult(matrix, Collections.max(values), Collections.min(values));}

5.可执行 jar 包

该程序可打为可执行jar包, 文件夹中的: kernel.jar
运行环境: jdk 1.8

执行示例:

java -jar kernel.jar 杭州市超市营业额.csv 杭州市超市营业额热力.jpg 经度 纬度 利润 2000.0 0.1 0
java -jar kernel.jar 杭州市超市营业额.csv 杭州市超市营业额分布.geojson 经度 纬度 利润 2000.0 0.1 0
java -jar kernel.jar 测试数据.csv 测试数据.jpg lon lat "" 300.0 0.1 0
java -jar kernel.jar 测试数据.csv 测试数据.geojson lon lat "" 300.0 0.1 0
参数参数位置参数说明
inputPath1输入的csv文件路径
outPath2输出的文件路径,程序根据文件后缀选择生产的文件类型,只允许 jpg、png、geojson 三种文件。
lonKey3输入文件中的经度字段名
latKey4输入文件中的纬度字段名
weightKey5输入文件中的权重字段名,没有则输入””
radius6影响半径,单位米,影响半径越长,周围空间受该数据的影响越广,需根据不同的输入数据情况调整
bufferSize7空间缓冲区,可扩大数据空间范围,一般0.1即可,即扩大 10% 的区域
step8空间划分步长,步长越小则参与计算的空间点数据越多,计算量越大,结果数据越精确, 需根据不同的输入数据情况调整,当值为0时,程序则适配生成一百万个点或网格参与计算,注:尽量不要在城市级别范围设置过低步长

四.执行结果展示

热力图示例:
在这里插入图片描述

平台分析示例:

在这里插入图片描述

杭州市超市营业额区域性分析-热力图:

在这里插入图片描述

杭州市超市营业额区域性分析-平台分析:
在这里插入图片描述

五、应用场景

  1. 金融风险评估:核密度算法可以用于评估某种投资方式的风险程度。将历史数据输入核密度估计器中,可以得出该投资方式在不同风险水平下的收益概率密度分布。这有助于金融机构更好地了解风险和收益之间的平衡。

  2. 生态学:核密度算法可用于研究动植物的栖息地和迁徙模式。将动植物的观察数据输入核密度估计器中,可以得出它们在不同地点出现的概率密度分布,帮助科学家更好地了解动植物的栖息地范围和活动规律。

  3. 交通流量预测:核密度算法可以用于预测道路上的交通流量。将历史交通流量数据输入核密度估计器中,可以得出在不同时间段内和不同位置上的交通流量概率密度分布。这有助于交通管理人员更好地规划道路、优化路线和管理交通拥堵。

  4. 模式识别:核密度算法可以使用于人脸识别、图像处理等领域。将输入数据的特征值输入核密度估计器中,可以得出不同特征值下相应数据的概率密度分布。这可用于识别图像中不同物体的特征值,例如人脸的轮廓和眼睛的位置,从而实现自动化识别。

相关文章:

核密度分析

一.算法介绍 核密度估计&#xff08;Kernel Density Estimation&#xff09;是一种用于估计数据分布的非参数统计方法。它可以用于多种目的和应用&#xff0c;包括&#xff1a; 数据可视化&#xff1a;核密度估计可以用来绘制平滑的密度曲线或热力图&#xff0c;从而直观地表…...

先进语言模型带来的变革与潜力

用户可以通过询问或交互方式与GPT-4这样的先进语言模型互动&#xff0c;开启通往知识宝库的大门&#xff0c;即时访问人类历史积累的知识、经验与智慧。像GPT-4这样的先进语言模型&#xff0c;能够将人类历史上积累的海量知识和经验整合并加以利用。通过深度学习和大规模数据训…...

重铸安卓荣光——上传图片组件

痛点&#xff1a; 公司打算做安卓软件&#xff0c;最近在研究安卓&#xff0c;打算先绘制样式 研究发现安卓并不像前端有那么多组件库&#xff0c;甚至有些基础的组件都需要自己实现&#xff0c;记录一下自己实现的组件 成品展示 一个上传图片的组件 可以选择拍照或者从相册中…...

Bert基础(四)--解码器(上)

1 理解解码器 假设我们想把英语句子I am good&#xff08;原句&#xff09;翻译成法语句子Je vais bien&#xff08;目标句&#xff09;。首先&#xff0c;将原句I am good送入编码器&#xff0c;使编码器学习原句&#xff0c;并计算特征值。在前文中&#xff0c;我们学习了编…...

Visual Studio快捷键记录

日常使用Visual Studio进行开发&#xff0c;记录一下常用的快捷键&#xff1a; 复制&#xff1a;CtrlC剪切&#xff1a;CtrlX粘贴&#xff1a;CtrlV删除&#xff1a;CtrlL撤销&#xff1a;CtrlZ反撤销&#xff1a;CtrlY查找&#xff1a;CtrlF/CtrlI替换&#xff1a;CtrlH框式选…...

分享84个Html个人模板,总有一款适合您

分享84个Html个人模板&#xff0c;总有一款适合您 84个Html个人模板下载链接&#xff1a;https://pan.baidu.com/s/1GXUZlKPzmHvxtO0sm3gHLg?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集…...

vue使用.sync和update实现父组件与子组件数据绑定的案例

在 Vue 中&#xff0c;.sync 是一个用于实现双向数据绑定的特殊修饰符。它允许父组件通过一种简洁的方式向子组件传递一个 prop&#xff0c;并在子组件中修改这个 prop 的值&#xff0c;然后将修改后的值反馈回父组件&#xff0c;实现双向数据绑定。 使用 .sync 修饰符的基本语…...

C语言系列15——C语言的安全性与防御性编程

目录 写在开头1 缓冲区溢出&#xff1a;如何防范与处理1.1 缓冲区溢出的原因1.2 预防与处理策略 2. 安全的字符串处理函数与使用技巧2.1 strncpy函数2.2 snprintf函数2.3 strlcpy函数2.4 使用技巧 3 防御性编程的基本原则与实际方法3.1 基本原则3.2 实际方法 写在最后 写在开头…...

objectMapper、ObjectNode、JsonNode调用接口时进行参数组装

objectMapper、ObjectNode、JsonNode用于调用接口时进行参数组装 public String sendText( List< String > listUser, String content ) throws JsonProcessingException{if ( listUser.size() < 0 ){return "用户ID为空&#xff01;";}if ( content.lengt…...

2024开年,手机厂商革了自己的命

文&#xff5c;刘俊宏 编&#xff5c;王一粟 2024开年&#xff0c;AI终端的号角已经由手机行业吹响。 OPPO春节期间就没闲着&#xff0c;首席产品官刘作虎在大年三十就迫不及待地宣布&#xff0c;OPPO正式进入AI手机时代。随后在开年后就紧急召开了AI战略发布会&#xff0c;…...

【安全】大模型安全综述

大模型相关非安全综述 LLM演化和分类法 A survey on evaluation of large language models,” arXiv preprint arXiv:2307.03109, 2023.“A survey of large language models,” arXiv preprint arXiv:2303.18223, 2023.“A survey on llm-gernerated text detection: Necess…...

Stable Diffusion 模型分享:AstrAnime(Astr动画)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五 下载地址 模型介绍 AstrAnime 是一个动漫模型&#xff0c;画风色彩鲜明&#xff0c;擅长绘制漂亮的小姐姐。 条目内容类型大模型…...

【GPTs分享】每日GPTs分享之Canva

简介 Canva&#xff0c;旨在帮助用户通过Canva的用户友好设计平台释放用户的创造力。无论用户是想设计海报、社交媒体帖子还是商业名片&#xff0c;Canva都在这里协助用户将创意转化为现实。 主要功能 设计生成&#xff1a;根据用户的描述和创意需求&#xff0c;生成定制的设…...

【机器学习】数据清洗——基于Pandas库的方法删除重复点

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…...

顺序表增删改查(c语言)

main函数&#xff1a; #include <stdio.h>#include "./seq.h"int main(int argc, const char *argv[]){SeqList* list create_seqList();insert_seqList(list,10);insert_seqList(list,100);insert_seqList(list,12);insert_seqList(list,23);show_seqList(l…...

MyBatis Plus中的动态表名实践

随着数据库应用的不断发展&#xff0c;面对复杂多变的业务需求&#xff0c;动态表名的处理变得愈发重要。在 MyBatis Plus&#xff08;以下简称 MP&#xff09;这一优秀的基于 MyBatis 的增强工具的支持下&#xff0c;我们可以更便捷地应对动态表名的挑战。本文将深入研究如何在…...

JAVA IDEA 项目打包为 jar 包详解

前言 如下简单 maven 项目&#xff0c;现在 maven 项目比较流行&#xff0c;你还没用过就OUT了。需要打包jar 先设置&#xff1a;点击 File > Project Structure > Artifacts > 点击加号 > 选择JAR > 选择From modules with dependencies 一、将所有依赖和模…...

概率基础——几何分布

概率基础——几何分布 介绍 在统计学中&#xff0c;几何分布是描述了在一系列独立同分布的伯努利试验中&#xff0c;第一次成功所需的试验次数的概率分布。在连续抛掷硬币的试验中&#xff0c;每次抛掷结果为正面向上的概率为 p p p&#xff0c;反面向上的概率为 1 − p 1-p …...

JavaScript的内存管理与垃圾回收

前言 JavaScript提供了高效的内存管理机制&#xff0c;它的垃圾回收功能是自动的。在我们创建新对象、函数、原始类型和变量时&#xff0c;所有这些编程元素都会占用内存。那么JavaScript是如何管理这些元素并在它们不再使用时清理它们的呢&#xff1f; 在本节中&#xff0c;…...

Neo4j导入数据之JAVA JDBC

目录结构 前言设置neo4j外部访问代码整理maven 依赖java 代码 参考链接 前言 公司需要获取neo4j数据库内容进行数据筛查&#xff0c;neo4j数据库咱也是头一次基础&#xff0c;辛辛苦苦安装好整理了安装neo4j的步骤&#xff0c;如今又遇到数据不知道怎么创建&#xff0c;关关难…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL

ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...

jdbc查询mysql数据库时,出现id顺序错误的情况

我在repository中的查询语句如下所示&#xff0c;即传入一个List<intager>的数据&#xff0c;返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致&#xff0c;会导致返回的id是从小到大排列的&#xff0c;但我不希望这样。 Query("SELECT NEW com…...