You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用多键从Hashtable获取最大值并处理指定结构CSV数据

多键取最大值的实现方案

1. 如何使用多个键从Hashtable中获取对应最大数值的方法

首先得明确:这里的“多个键”一般是指按多个维度的键进行分组,然后在每个分组内找出对应数值的最大值。比如你的Hashtable键是复合结构(比如RecordKey+SequenceNumber),或者你需要基于多个键维度聚合数据。下面是具体步骤和示例:

核心思路

  • 第一步:确定分组规则。先明确哪些键是你的分组维度(比如只按RecordKey,或者RecordKey+SequenceNumber组合)。
  • 第二步:遍历Hashtable,按分组维度聚合最大值。用一个临时Map来存储每个分组当前的最大值,遍历每个Entry时,对比当前值和临时Map中对应分组的值,保留更大的那个。
  • 第三步:提取结果。遍历临时Map就能得到每个多键分组对应的最大值。

Java代码示例

假设你的Hashtable键是拼接的复合字符串(比如"RecordKey_SequenceNumber"),值是日期转成的时间戳(方便数值比较):

import java.util.Hashtable;
import java.util.Map;
import java.util.HashMap;

public class MultiKeyMaxFromHashtable {
    public static void main(String[] args) {
        Hashtable<String, Long> dataTable = new Hashtable<>();
        // 模拟数据:键为"RecordKey_SequenceNumber",值为Arrival Date的时间戳
        dataTable.put("18010312076777_1", 1516060800000L); // 01/16/2018
        dataTable.put("18010312076777_2", 1516147200000L); // 01/17/2018
        dataTable.put("18010312078634_1", 1516060800000L); // 01/16/2018
        dataTable.put("18010312078634_2", 1516320000000L); // 01/18/2018

        // 按RecordKey分组,找每个组的最大时间戳
        Map<String, Long> maxByRecordKey = new HashMap<>();

        for (Map.Entry<String, Long> entry : dataTable.entrySet()) {
            String compositeKey = entry.getKey();
            Long timestamp = entry.getValue();
            // 拆分复合键,提取RecordKey作为分组维度
            String recordKey = compositeKey.split("_")[0];

            // 更新最大值
            if (!maxByRecordKey.containsKey(recordKey) || timestamp > maxByRecordKey.get(recordKey)) {
                maxByRecordKey.put(recordKey, timestamp);
            }
        }

        // 输出结果
        for (Map.Entry<String, Long> entry : maxByRecordKey.entrySet()) {
            System.out.printf("RecordKey: %s 对应的最晚到达时间戳: %d%n", entry.getKey(), entry.getValue());
        }
    }
}

2. 针对给定CSV数据的多键取最大值技术方案

你的CSV数据包含Record Key、Sequence Number、Transportation Segment Number、Arrival Date字段,需求应该是按指定的多键分组,找出每组中最晚的Arrival Date。下面提供几种常用的实现方案:

通用思路

  1. 解析CSV:读取每一行数据,提取所需字段;
  2. 日期转换:把字符串格式的Arrival Date转换成可比较的日期对象(比如Python的datetime、Java的LocalDate);
  3. 分组聚合:按目标多键分组,保留每组的最大日期;
  4. 输出结果:将聚合后的最大日期转回原字符串格式输出。

方案一:Python脚本实现

Python处理CSV非常便捷,用内置的csv模块和datetime模块就能搞定:

import csv
from datetime import datetime
from collections import defaultdict

# 兼容带前导零和不带的日期格式(如01/16/2018、1/10/2018)
DATE_FORMAT = "%m/%d/%Y"

# 示例1:按Record Key单键分组,找最晚Arrival Date
max_dates_by_record = defaultdict(lambda: datetime.min)

with open("transport_data.csv", "r") as csv_file:
    reader = csv.DictReader(csv_file)
    for row in reader:
        record_key = row["Record Key"]
        arrival_date_str = row["Arrival Date"]
        # 解析日期
        arrival_date = datetime.strptime(arrival_date_str, DATE_FORMAT)
        # 更新当前分组的最大日期
        if arrival_date > max_dates_by_record[record_key]:
            max_dates_by_record[record_key] = arrival_date

# 输出结果
print("=== 按Record Key分组的最晚到达日期 ===")
for record_key, max_date in max_dates_by_record.items():
    print(f"Record Key: {record_key} → 最晚到达日期: {max_date.strftime(DATE_FORMAT)}")

# 示例2:按Record Key + Sequence Number组合键分组
max_dates_by_composite = defaultdict(lambda: datetime.min)

with open("transport_data.csv", "r") as csv_file:
    reader = csv.DictReader(csv_file)
    for row in reader:
        composite_key = (row["Record Key"], row["Sequence Number"])
        arrival_date_str = row["Arrival Date"]
        arrival_date = datetime.strptime(arrival_date_str, DATE_FORMAT)
        if arrival_date > max_dates_by_composite[composite_key]:
            max_dates_by_composite[composite_key] = arrival_date

print("\n=== 按Record Key+Sequence Number分组的最晚到达日期 ===")
for (record_key, seq_num), max_date in max_dates_by_composite.items():
    print(f"Record Key: {record_key}, Sequence Number: {seq_num} → 最晚到达日期: {max_date.strftime(DATE_FORMAT)}")

方案二:SQL实现(导入CSV到数据库后)

如果把CSV导入到MySQL等数据库,可以直接用GROUP BY语句快速聚合:

SELECT
    `Record Key`,
    `Sequence Number`,
    MAX(STR_TO_DATE(`Arrival Date`, '%m/%d/%Y')) AS Max_Arrival_Date
FROM transport_data
GROUP BY `Record Key`, `Sequence Number`;

这里STR_TO_DATE函数把字符串日期转成数据库可识别的日期类型,MAX函数直接取每组的最大值,GROUP BY指定多键分组维度。


内容的提问来源于stack exchange,提问作者Hellfire

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:28:41