首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl散列的Java等价物

Perl散列的Java等价物
EN

Stack Overflow用户
提问于 2011-01-23 00:45:26
回答 8查看 9.9K关注 0票数 8

由于超强的灵活性和方便性,我已经使用了很多Perl散列。例如,在Perl中,我可以执行以下操作:

代码语言:javascript
复制
$hash{AREA_CODE}->{PHONE}->{STREET_ADDR}

我想知道我怎样才能用Java完成同样的事情,我猜这和HashMap有关。

谢谢,

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-01-23 03:00:55

由于

的超强灵活性和便利性,我已经使用了很多Perl哈希。例如,在Perl中,我可以这样做:,我想知道怎样才能用$hash{AREA_CODE}->{PHONE}->{STREET_ADDR}完成同样的事情,我猜这与HashMap有关?

Java代码近似于以下Perl代码:

代码语言:javascript
复制
my %hash;
$hash{AREA_CODE}{PHONE}{STREET_ADDR} = "221B Baker Street";
printf "Street address is %s\n", $hash{AREA_CODE}{PHONE}{STREET_ADDR};

代码语言:javascript
复制
HashMap<String, HashMap<String, HashMap<String, String>>> hash =
    new HashMap<String, HashMap<String, HashMap<String, String>>>();

hash.put("AREA_CODE", new HashMap<String, HashMap<String, String>>());
hash.get("AREA_CODE").put("PHONE", new HashMap<String, String>());
hash.get("AREA_CODE").get("PHONE").put("STREET_ADDR", "221B Baker Street");

System.out.printf("Street address is %s\n",
    hash.get("AREA_CODE").get("PHONE").get("STREET_ADDR"));

这不是很特别吗?:)

我说“近似值”有很多原因。其中之一是,在Java中,仅仅是因为想要在Java的下一行代码中执行与此完全直接的Perl代码等效的操作,您就会感到沮丧到了极致的程度:

代码语言:javascript
复制
$hash{AREA_CODE}{PREFIX} = 800;

如果您想要Perl的灵活性和便利性,Java根本不会满足您的需求。更糟糕的是,它的支持者经常会因为你表达了这样的愿望而斥责你。

票数 18
EN

Stack Overflow用户

发布于 2011-01-23 04:37:32

首先,您的特定示例($hash{AREA_CODE}->{PHONE}->{STREET_ADDR}),使用硬编码字符串作为散列键,在Java语言中并不是一个真正有用的数据结构,正如Michael Carman指出的那样-它应该存储为具有属性的类(老实说,这在概念上是一个糟糕的数据结构-像这样的数据更有可能是一组音素,而不是音素的散列)。

其次,假设你实际上指的是$hash{$AREA_CODE}->{$PHONE}->{$STREET_ADDR},到目前为止,看起来每个人的Java代码都没有实现一个通用的等价代码-代码都假设Java hash是新初始化的,用于存储示例或完全填充用于检索示例(换句话说,正如leonbloy的答案所指出的,缺少自动生动功能)。

模仿自动生动的正确代码是:

代码语言:javascript
复制
// This method will ensure that hash-of-hash-of-hashes structure exists of a given set of 3 keys.
public HashMap<String, HashMap<String, HashMap<String, Object>>>
 autovivification_3rd_level (
           HashMap<String, HashMap<String, HashMap<String, Object>>> hash
         , String AREA_CODE, String PHONE, String STREET_ADDR) {
    if (hash == null) {
        hash = new HashMap<String, HashMap<String, HashMap<String, Object>>>();
    }
    if (!hash.contains(AREA_CODE) || hash.get(AREA_CODE) == null) {
        hash.put(new HashMap<String, HashMap<String, Object>>());
    }
    HashMap<String, HashMap<String, Object>> AREA_CODE_hash
         = (HashMap<String, HashMap<String, Object>>) hash.get(AREA_CODE);
    if (!AREA_CODE_hash.contains(PHONE) || AREA_CODE_hash.get(PHONE) == null) {
        AREA_CODE_hash.put(new HashMap<String, Object>());
    }
    return hash;
}

////////////////////////////////////////////////////////////////////////////////////    

// Equivalent to Perl's "$hash{$AREA_CODE}->{$PHONE}->{$STREET_ADDR} = value;"
public Object put_3d_level_hash(
          HashMap<String, HashMap<String, HashMap<String, Object>>> hash
        , String AREA_CODE, String PHONE, String STREET_ADDR,
        , Object value) {
    hash = autovivification_3rd_level(hash, AREA_CODE, PHONE, STREET_ADDR);
    return hash.get(AREA_CODE).get(PHONE).put(STREET_ADDR, value);
}
put_3d_level_hash(hash, AREA_CODE, PHONE, STREET_ADDR, obj);

////////////////////////////////////////////////////////////////////////////////////    

// Equivalent to Perl's "$var = $hash{$AREA_CODE}->{$PHONE}->{$STREET_ADDR}"
public Object get_3d_level_hash(HashMap<String, HashMap<String, HashMap<String, Object>>> hash
                       , String AREA_CODE, String PHONE, String STREET_ADDR) {
    hash = autovivification_3rd_level(hash, AREA_CODE, PHONE, STREET_ADDR);
    return hash.get(AREA_CODE).get(PHONE).get(STREET_ADDR);
}
Object obj = get_3d_level_hash(hash, AREA_CODE, PHONE, STREET_ADDR);
票数 6
EN

Stack Overflow用户

发布于 2011-01-23 00:53:50

请参阅Map接口及其实现,特别是HashMap

注意,Java没有Perl的自动形象化( dangerous特性),所以

代码语言:javascript
复制
hash.get("areaCode").get("phone").get("streetAdr")

将抛出一个异常,例如,get(phone)返回null。还要注意,您不应该对具有固定名称(“属性”)的对象使用散列,您应该使用它的getter和setter来定义您自己的类。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4769111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档