在java中使用多种类型的值进行映射

我必须完成一个奇怪的特殊场景。 其描述如下:

我必须设计一个Map,其中’ Keys ‘总是String类型。 但是,其中一个键的’ Value ‘可能是String或List (取决于特定键可以具有的值的数量。如果该特定键只有一个值,则’Value’将是一个String,并且它必须如果密钥包含许多值,则为List。 如何完成这种情况?

例如:地图中有2个键,即“姓名”和“电话号码”。 一个人只能有一个姓名和多个电话号码。 所以这里的第一个键,即“Name”应该具有Value的’String’类型,而对于第二个键,即“Phone Nos”应该具有Value的’List’类型。 如何申报这样的地图。 可能吗?

可以执行Map

但是 :我强烈建议你考虑你的设计。 您应该为您的人使用课程。 这样你可以这样做: Map with Person有getter和setter的名字,电话号码和其他信息。

示例Person类:

 public class Person { private String name; private List phoneNumbers = Collections.emptyList(); public void setName(String name) { this.name = name; } public String getName() { return name; } public void setPhoneNumbers(List phoneNumbers) { this.phoneNumbers = phoneNumbers; } public void addPhoneNumber(String number) { phoneNumbers.add(number); } public List getPhoneNumbers() { return phoneNumbers; } } 

当然有。 选择你的毒药:

 Map mixed = new HashMap(); Map mixed = new HashMap(); @SuppressWarnings("rawtypes") Map mixed = new HashMap(); 

好吧,为什么不制作Map> ? 如果只有一个值或者使用String和List的常用超类型,你总是可以在列表中添加一个元素,这样你就可以得到

 Map 

我会做以下其中一项:

  1. 使用Multimap 。 Multimap将包含与每个键关联的一个或多个值。

  2. 使用Map>> 。 使用Either来区分单个或多个值。

为什么不制作一个PhoneNumber包装类来公开一个API,用于存储一个或多个电话号码,然后可以检索一个或所有(多个)电话号码,然后制作一个String和PhoneNumber的映射? 就像是:

 class PhoneNumber { private String[] phoneNumbers; public void storePhoneNumber(String... phoneNumbers) { this.phoneNumbers = phoneNumbers; } public String getPhoneNumber() { if(phoneNumbers.length>=1) { return phoneNumbers[0]; } else { return null; } } public List getPhoneNumbers() { if(phoneNumbers!=null) { return Arrays.asList(phoneNumbers); } else { return null; } } 

}