gpt4 book ai didi

java - 在 Java 中使用公共(public)键合并两个列表

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:21:47 25 4
gpt4 key购买 nike

我从 AS400 查询中获取一个列表,从 SQL Server 查询中获取另一个列表。我需要将这两个列表合并为一个列表。第一个列表是我们库存中的每项 Assets ,如下所示:

[
{
"assetId": 0,
"type": "OV",
"truckNumber": "L122",
"longitude": 0,
"latitude": 0,
"id": 0
},
{
"assetId": 0,
"type": "PO",
"truckNumber": "SQ46",
"longitude": 0,
"latitude": 0,
"id": 0
}
]

第二个列表有更多的细节,看起来像这样,两个列表有一个共同的字段,truckNumber:

[
{
"trailerGroup": "C",
"assetId": 308,
"loaded": false,
"dedicated": false,
"intermodal": false,
"sealed": false,
"truckNumber": "L122",
"companyOwned": true,
"onSite": false,
"customerId": "KTPH",
"id": 308,
"modified": {
"when": 1546498401156
},
"created": {
"when": 1546498401156
}
},
{
"trailerGroup": "C",
"assetId": 309,
"loaded": false,
"dedicated": false,
"intermodal": false,
"sealed": false,
"truckNumber": "SQ46",
"companyOwned": true,
"onSite": true,
"customerId": "KTPH",
"id": 309,
"modified": {
"when": 1546498401156
},
"created": {
"when": 1546498401156
}
}
]

我需要更新任何现有值(如经度),同时添加任何不在第一个查询中的值。

我尝试了一些合并示例,但根本不起作用,或者其他示例只是将第一个列表附加到第二个列表。


可能的解决方案:

有人看到这方面的问题吗?

List<Trailer> trailers = null;
List<Trailer> trailersAS400 = null;
List<Trailer> trailersSQLServer = null;

try {
trailersAS400 = getTrailerAS400Proxy().getTrailers();
trailersSQLServer = getTrailerSQLServerProxy().getTrailers();

Map<String, Trailer> map = new HashMap<>();
for (Trailer t : trailersAS400) {
map.put(t.getNumber(), t);
}
for (Trailer t : trailersSQLServer) {
String key = t.getNumber();
if (map.containsKey(key)) {
map.get(key).setNumber(t.getNumber());
} else {
map.put(key, t);
}
}
trailers = new ArrayList<>(map.values());

}

最佳答案

如果您使用的是 Jackson(最流行的 JSON 库之一),您可以按如下方式简单地实现:

代码片段

ObjectMapper mepper = new ObjectMapper();
List<Map<String, Object>> listAs400 = mepper.readValue(jsonStrAs400, List.class);
List<Map<String, Object>> listSqlServer = mepper.readValue(jsonStrSqlServer, List.class);
listAs400.forEach(e1 -> {
listSqlServer.forEach(e2 -> {
if (e1.get("truckNumber").toString().equals(e2.get("truckNumber").toString())) {
e2.forEach((k, v) -> {
e1.put(k, v);
});
}
});
});
System.out.println(mapper.writeValueAsString(listAs400));

控制台输出

[ 
{
"assetId":308,
"type":"OV",
"truckNumber":"L122",
"longitude":0,
"latitude":0,
"id":308,
"trailerGroup":"C",
"loaded":false,
"dedicated":false,
"intermodal":false,
"sealed":false,
"companyOwned":true,
"onSite":false,
"customerId":"KTPH",
"modified":{
"when":1546498401156
},
"created":{
"when":1546498401156
}
},
{
"assetId":309,
"type":"PO",
"truckNumber":"SQ46",
"longitude":0,
"latitude":0,
"id":309,
"trailerGroup":"C",
"loaded":false,
"dedicated":false,
"intermodal":false,
"sealed":false,
"companyOwned":true,
"onSite":true,
"customerId":"KTPH",
"modified":{
"when":1546498401156
},
"created":{
"when":1546498401156
}
}
]

关于java - 在 Java 中使用公共(public)键合并两个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54042027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com