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

如何在Java Hashtable中存储并检索Matlab结构体(无需额外工具箱)

解决方案:无需额外工具箱实现Matlab结构体存入Java哈希表

以下是三种不需要额外工具箱的可行方案,按简便程度排序:

方案1:JSON序列化(最简便,适用于R2016b+)

利用Matlab内置的jsonencode和jsondecode函数,将结构体转为JSON字符串存入Hashtable,还原时再解码。优点是代码简洁、可读性强,支持绝大多数常用数据类型(数字、字符串、数组、嵌套结构体)。

% 初始化Java Hashtable和Matlab结构体
h = java.util.Hashtable;
mystruct = struct('a', 1, 'b', 'test', 'c', struct('d', [1 2 3]));

% 存入:结构体转JSON字符串后放入Hashtable
json_str = jsonencode(mystruct);
h.put('foo', json_str);

% 取出还原:从Hashtable获取字符串,解码为结构体
retrieved_json = char(h.get('foo'));
retrieved_struct = jsondecode(retrieved_json);

注意:复数、函数句柄、自定义对象等JSON不支持的类型无法用此方法,需用其他方案。

方案2:二进制序列化(支持所有Matlab数据类型)

通过save将结构体写入临时文件,读取文件内容为二进制字符串存入Hashtable;还原时反向操作。此方法能处理任意复杂度的结构体,包括嵌套、特殊数据类型。

% 结构体转二进制字符串
function str = struct2bin(s)
    temp_file = tempname;
    save(temp_file, '-struct', 's');
    fid = fopen(temp_file, 'rb');
    str = fread(fid, '*char')';
    fclose(fid);
    delete(temp_file);
end

% 二进制字符串转结构体
function s = bin2struct(str)
    temp_file = tempname;
    fid = fopen(temp_file, 'wb');
    fwrite(fid, str, 'char');
    fclose(fid);
    s = load(temp_file, '-struct');
    delete(temp_file);
end

% 实际使用
h = java.util.Hashtable;
mystruct = struct('a', 1+2i, 'b', @sin, 'c', struct('d', {1, 'test'}));

% 存入
bin_str = struct2bin(mystruct);
h.put('foo', bin_str);

% 取出还原
retrieved_bin = char(h.get('foo'));
retrieved_struct = bin2struct(retrieved_bin);

方案3:转换为Java哈希表(适合Java侧直接访问)

递归将Matlab结构体转换为java.util.HashMap(比Hashtable更轻量,若需线程安全可改用Hashtable),存入目标Hashtable。还原时再将Java哈希表转回Matlab结构体。

% Matlab结构体转Java HashMap
function j_map = struct2javamap(s)
    j_map = java.util.HashMap;
    fields = fieldnames(s);
    for i = 1:length(fields)
        field_name = fields{i};
        field_val = s.(field_name);
        if isstruct(field_val)
            % 嵌套结构体递归转换
            j_map.put(field_name, struct2javamap(field_val));
        elseif iscell(field_val)
            % Cell数组转Java ArrayList
            j_list = java.util.ArrayList;
            for j = 1:length(field_val)
                elem = field_val{j};
                j_list.add(isstruct(elem) ? struct2javamap(elem) : elem);
            end
            j_map.put(field_name, j_list);
        else
            % 基本数据类型直接存入
            j_map.put(field_name, field_val);
        end
    end
end

% Java HashMap转Matlab结构体
function s = javamap2struct(j_map)
    s = struct();
    keys = j_map.keySet().toArray();
    for i = 1:length(keys)
        key = char(keys(i));
        val = j_map.get(key);
        if isa(val, 'java.util.HashMap')
            s.(key) = javamap2struct(val);
        elseif isa(val, 'java.util.ArrayList')
            cell_arr = cell(val.size(), 1);
            for j = 0:val.size()-1
                elem = val.get(j);
                cell_arr{j+1} = isa(elem, 'java.util.HashMap') ? javamap2struct(elem) : elem;
            end
            s.(key) = cell_arr;
        else
            s.(key) = val;
        end
    end
end

% 实际使用
h = java.util.Hashtable;
mystruct = struct('a', 1, 'b', [2 3 4], 'c', struct('d', {'x', 5}));

% 存入
j_map = struct2javamap(mystruct);
h.put('foo', j_map);

% 取出还原
retrieved_map = h.get('foo');
retrieved_struct = javamap2struct(retrieved_map);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 10:11:12