【问题标题】:A Dictionary where its value is an Array in Java一个字典,它的值是Java中的一个数组
【发布时间】:2014-03-02 15:29:14
【问题描述】:

如何在Java中设计这种类实现?在某种程度上:

<K, V[]>

假设我们有一个药物数据库,我们想将其所有相应的副作用添加到它的 V[] 中,其中 V[] 是副作用列表(可能是字符串列表)?

我试过&lt;K, V[]&gt;,但没用。可能我的实现有问题。我不确定如何设计这样的数据结构。请帮忙,谢谢。


第一次尝试:

我已经初始化了一小段代码:

import java.io.Serializable;
import java.util.List;
import java.util.Map;

public class DrugDatabse
{
    private Drug[] listOfDrugs;
    private class Drug<K, List<V>> implements Map, Serializable
    {
        private Map<K, List<V>> dictionary = new Map<K, List<V>>();
        private List<V> sideEffects = new List<V>();

        private Drug(K name, V sideEffects)
        {
        }
    }
}

看起来这不是一个好的开始。


第二次尝试:

药物数据库.java:

import java.util.List;
import java.util.Map;
import java.util.HashMap;

public class DrugDatabase
{
    private Map<Drug, List<SideEffect>> map = new HashMap<Drug, 
            List<SideEffect>>();

    public DrugDatabase(Drug name, SideEffect se)
    {
        map.put(name, se);
    }

    public SideEffect add(Drug name, SideEffect se)
    {
        map.get(name).add(se);
    }

    public List<SideEffect> getSideEffects(Drug name)
    {
        return map.get(name);
    }
}

药物.java:

public class Drug
{
    private String name;
    public Drug(String name)
    {
        this.name = name;
    }
}

SideEffect.java:

import java.util.List;
import java.util.ArrayList;

public class SideEffect
{
    private List<String> se = new ArrayList<String>();

    public SideEffect(String content)
    {
        se.add(content);
    }
}

【问题讨论】:

  • 你想要一个Map&lt;Drug, List&lt;SideEffect&gt;&gt;。或番石榴Multimap&lt;Drug, SideEffect&gt;Map&lt;Drug, SideEffect[]&gt; 也是可能的,但数组是固定长度的。你是怎么测试的?
  • @JBNizet 编译器不允许在 &lt;K, V[]&gt; 中使用 V[]
  • 向我们展示真实代码。 V 不是一个类。 Map&lt;Drug, SideEffect[]&gt; 是一个有效的声明(前提是 Drug 和 SideEffect 是现有的类)。
  • 我已经删除了源代码......它在我的实现中不起作用(它一定是有问题的)。
  • 下次你在这里提问时,贴出你尝试过的代码。这样我们至少可以解释你做错了什么。

标签: java arrays list dictionary


【解决方案1】:

要么使用:

Map<K, List<V>>

或者使用 Guava 和 a:

Multimap<K, V>

Guava 的实现优势是您无需担心不存在的密钥;而对于前者,您必须自己为每个新密钥创建一个空的 List&lt;V&gt;

Guava 的 Multimap 的另一个优点是您有一个 .containsValue() 方法,如果 任何列表中的元素存在,它将查看所​​有 List&lt;V&gt; 条目。

简而言之,使用番石榴。 Link to Multimap javadoc.

编辑:如果您有许多药物共有的许多副作用,您也可以看看 Guava's Table。

【讨论】:

  • 能否给我一个实现的例子,例如在普通java上给药物“阿司匹林”添加一个副作用“se1”?我对如何使用地图感到困惑
  • List&lt;String&gt; sideEffects = map.get("Aspirin"); sideEffects.add("se1");
  • 或者,更短的形式:map.get("Aspirin").add("se1"); .get() 返回一个List,它有一个.add() 方法。但同样,如果您没有 "aspirin" 密钥,您就会遇到问题,Multimap 会为您解决。请注意,它假定 String 既是键又是值。
猜你喜欢
  • 2021-01-21
  • 2020-07-17
  • 2018-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多