【问题标题】:Maps with multiple types of values in javajava中具有多种类型值的映射
【发布时间】:2012-03-04 19:38:48
【问题描述】:

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

我必须设计一个地图,其中“Keys”始终为 String 类型。但是,其中一个键的 'Value' 可能是 String 或 List(取决于特定键可以具有的值的数量。'Value' 将是如果该特定键只有一个值,则为 String,如果该键包含许多值,则它必须是 List)。如何完成这个场景?

例如:地图中有两个键,即“姓名”和“电话号码”。一个人只能有一个姓名和多个电话号码。所以这里第一个键,即“名称”应该有“字符串”类型的值,而第二个键,即“电话号码”应该有“列表”类型的值。如何声明这样的地图。有可能吗?

【问题讨论】:

标签: java types map key


【解决方案1】:

可以做类似Map<String, Object>的事情。

但是:我强烈建议重新考虑您的设计。你应该为你的人使用一个类。这样你就可以做到:Map<String, Person>Person 拥有用于获取姓名、电话号码和其他信息的 getter 和 setter。

例如Person类:

public class Person {

    private String name;
    private List<String> phoneNumbers = Collections.emptyList();

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setPhoneNumbers(List<String> phoneNumbers) {
        this.phoneNumbers = phoneNumbers;
    }

    public void addPhoneNumber(String number) {
        phoneNumbers.add(number);
    }

    public List<String> getPhoneNumbers() {
        return phoneNumbers;
    }
}

【讨论】:

    【解决方案2】:

    好吧,为什么不创建一个Map&lt;String, List&lt;String&gt;&gt;?如果只有一个值,您总是可以在列表中添加一个元素,或者使用 String 和 List 的通用超类型,因此您会得到

    Map<String, Object>
    

    【讨论】:

    • 用户要求使用这种结构的方法:"Name" -&gt; "Sam Something", "Phone Nos" -&gt; "1234", "5678" 仍然无法与您的示例一起使用。
    • Guava 的 ListMultimapMap&lt;X, List&lt;Y&gt;&gt; 更好用
    • @nfechner:为什么它不起作用?对象可以是任何可以在 java 中表示的东西,还是我在这里遗漏了什么?
    【解决方案3】:

    当然有。选择你的毒药:

    Map<String, Object> mixed = new HashMap<String, Object>();
    
    Map<String, Serializable> mixed = new HashMap<String, Serializable>();
    
    @SuppressWarnings("rawtypes")
    Map mixed = new HashMap();
    

    【讨论】:

    • 你能解释一下那里发生了什么吗?
    【解决方案4】:

    我会做以下事情之一:

    1. 使用Multimap&lt;String, String&gt;Multimap 将包含一个或多个与每个键关联的值。

    2. 使用Map&lt;String, Either&lt;String, List&lt;String&gt;&gt;&gt;。使用Either 区分单个值或多个值。

    【讨论】:

      【解决方案5】:

      为什么不创建一个 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<String> getPhoneNumbers() {
          if(phoneNumbers!=null) {
            return Arrays.asList(phoneNumbers);
          } else {
            return null;
          }
      
        }
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 2012-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-26
        相关资源
        最近更新 更多