由于超强的灵活性和方便性,我已经使用了很多Perl散列。例如,在Perl中,我可以执行以下操作:
$hash{AREA_CODE}->{PHONE}->{STREET_ADDR}我想知道我怎样才能用Java完成同样的事情,我猜这和HashMap有关。
谢谢,
发布于 2011-01-23 03:00:55
由于
的超强灵活性和便利性,我已经使用了很多Perl哈希。例如,在Perl中,我可以这样做:,我想知道怎样才能用
$hash{AREA_CODE}->{PHONE}->{STREET_ADDR}完成同样的事情,我猜这与HashMap有关?
Java代码近似于以下Perl代码:
my %hash;
$hash{AREA_CODE}{PHONE}{STREET_ADDR} = "221B Baker Street";
printf "Street address is %s\n", $hash{AREA_CODE}{PHONE}{STREET_ADDR};是
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代码等效的操作,您就会感到沮丧到了极致的程度:
$hash{AREA_CODE}{PREFIX} = 800;如果您想要Perl的灵活性和便利性,Java根本不会满足您的需求。更糟糕的是,它的支持者经常会因为你表达了这样的愿望而斥责你。
发布于 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的答案所指出的,缺少自动生动功能)。
模仿自动生动的正确代码是:
// 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);发布于 2011-01-23 00:53:50
请参阅Map接口及其实现,特别是HashMap。
注意,Java没有Perl的自动形象化( dangerous特性),所以
hash.get("areaCode").get("phone").get("streetAdr")将抛出一个异常,例如,get(phone)返回null。还要注意,您不应该对具有固定名称(“属性”)的对象使用散列,您应该使用它的getter和setter来定义您自己的类。
https://stackoverflow.com/questions/4769111
复制相似问题