java - 在合并之前或在代码之后在 mysql 中订购两个列表?
问题描述
假设我有两个列表,其中包含从 mysql 查询返回的值(出于这个问题的目的,我将在此处将它们显示为已初始化,以便更容易查看列表的内容):
List<String> databaseResultsA = new ArrayList<>();
databaseResultsA.add("6");
databaseResultsA.add("7");
databaseResultsA.add("9");
List<String> databaseResultsB = new ArrayList<>();
databaseResultsB.add("4");
databaseResultsB.add("8");
databaseResultsB.add("2");
实际上,databaseResultsA 使用 MySQL ORDER BY ASC 排序,而 databaseResultsB 没有排序。另外值得注意的是,databaseResultsB 是从 databaseResultsA 对单独的数据库进行查询的结果。
我需要将两个列表组合起来并按升序排序,因此我在代码中执行以下操作:
List<String> combinedResults = Stream.concat(databaseResultsA.stream(), databaseResultsB.stream()).sorted().distinct().collect(Collectors.toList());
我对 databaseResultsA 进行排序的原因是我希望 databaseResultsA 需要比 databaseResultsB 更频繁地返回结果;因此,如果 databaseResultsB 为空,那么代码中的排序就会减少(databaseResultsA 可能为空,而 databaseResultsB 可能有结果,但我不希望这种情况像相反的那样频繁发生)。
我的问题是,我的逻辑听起来合理吗?或者在 MySQL 中对两个列表进行排序然后在代码中排序会更好吗?我猜这是一个应该根据具体情况来判断的事情,但只是想知道这是否有经验法则。
解决方案
如果查询不同但在同一个数据库上,我什至不会在代码中组合。我会使用 UNION DISTINCT 然后 ORDER BY。服务器的排序很可能比任何 java 代码都快,您甚至可以通过不下载重复的行来节省一些带宽。
既然您编辑了问题并说数据库是不同的,我仍然会使用 ORDER BY 对两个查询进行排序。然后我会使用合并排序,因为你有 2 个排序的输入。我不会使用流来释放宝贵的预排序状态,而不得不再次求助。
在目标列表中合并 2 个排序的迭代器也很容易自己编写。
推荐阅读
- javascript - UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝 id:1):ReferenceError:registrationTokens 未定义
- spring - 如何使用 vaadin4spring 运行 hazelcast 会话复制?
- php - 如何在 PHP 中创建具有多个字段的数组
- windows - git命令行中的&符号(&)和下划线(_)问题
- node.js - 使用 dockerfile 构建 docker 时找不到 ./asinstall?
- hibernate - 避免在 grails 中连接表
- scala - +垫是什么意思?
- reactjs - GeoJSON 标记未显示在我的 Leafletjs 地图上
- python - 简单 pptk 示例中未显示的点
- android - pcm_open 和 pcm_is_ready 调用失败,因为 pcm->fd 返回负整数