1

我有一个包含以下成员的类

private String patientName;
private String patientPhoneNumber;

现在我有多个名字附在电话号码上,例如

1234567, AAA
1234567, BBB
8765432, CCC
8765432, GGG

现在我想将它们存储在地图中,但电话号码应该是具有多个值的键,对于 1234567,我应该具有值 AAA 和 BBB,请告诉我如何在地图中使用单个键存储多个值我的键是电话号码,然后请让我知道我是否想在控制台中打印然后我将遍历地图

另外请不要说我想维持订单也让我先得到价值 AAA 然后 BBB 所以我也应该维持这些订单,因为我得到这只是一个例子,但在我的场景中,我将从后端获得这个值所以维持秩序也是必要的,请指教。

4

7 回答 7

2

你可以尝试这样的事情:

HashMap<String,LinkedList<String>> map
于 2013-01-03T03:16:00.190 回答
2
new Map<String, TreeSet<String>>()

将允许您将值存储在TreeSet(排序的...)中。

要打印它们:

for(Map.Entry entry : phoneBook.entries()){
    System.out.println(entry.key() + ":");
    TreeSet names = entry.value();
    for(String name : names){
        System.out.println("\t" + name);
    }
}

如果您想要不区分大小写的排序,您可以像这样添加:

TreeSet<String> nameSet = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
phoneBook.add(number, nameSet);
于 2013-01-03T03:16:39.113 回答
2
private Map<String,List<String>> patients;

public void setPatientNumber(String number, String patient){
    List<String> list = patients.get(number);
    if(list == null){
        list = new ArrayList<String>();
        patients.put(number,list);
    }
    list.add(patient);
}
于 2013-01-03T03:17:58.000 回答
1

对每个值使用 aLinkedHashMap和 an :ArrayList

LinkedHashMap<String,ArrayList<String>> phoneNumbers = new LinkedHashMap<String,ArrayList<String>>();

// register new phone number
phoneNumbers.put("1234567", new ArrayList<String>());

// add names to the phone number
phoneNumbers.get("1234567").add("AAA");
phoneNumbers.get("1234567").add("BBB");

两个集合都保留了插入顺序。

**编辑**

在这里,这大致就是您所需要的(这是在没有太多测试的情况下在现场完成的,但您应该明白这一点)。由于您的订购可能会有所不同,我认为限制重复并提供订购比较器应该是可取的(正如其他答案所建议的那样):

public class LinkedMultiMap<K,V> {

    private Comparator<V> comparator;
    private LinkedHashMap<K,Set<V>> entries;

    public LinkedMultiMap() {
        this(null);
    }

    public LinkedMultiMap(Comparator<V> comparator) {
        this.comparator = comparator;
        this.entries = new LinkedHashMap<K, Set<V>>();
    }

    public boolean add(K key, V value) {
        if (!entries.containsKey(key)) {
            entries.put(key, new TreeSet<V>(comparator));
        }

        return entries.get(key).add(value);
    }

    public Collection<V> get(K key) {
        return entries.get(key);
    }

    public boolean remove(K key, V value) {
        boolean removed = false;
        if (entries.containsKey(key)) {
            removed = entries.get(key).remove(value);

            if (entries.get(key).isEmpty()) {
                entries.remove(key);
            }
        }
        return removed;
    }

    public Collection<V> removeAll(K key) {
        return entries.remove(key);
    }

    public Iterator<K> keyIterator() {
        return entries.keySet().iterator();
    }
}
于 2013-01-03T03:14:01.833 回答
1

将多个值与单个键关联

那是一个Multimap

类似于 Map 的集合,但可以将多个值与单个键相关联。

来自 Google Collections 的LinkedHashMultimap似乎符合要求:

Multimap 的实现,它不允许重复的键值条目,并返回其迭代器遵循将数据添加到 multimap 的顺序的集合。

如果不想添加依赖,可以使用集合作为值类型:

Map<String /*number*/, List<String> /*names*/> numbers;

请注意,前者仅允许按插入顺序检索,如果您希望能够更改它,则必须使用后者的手动解决方案

于 2013-01-03T03:14:26.370 回答
0

使用 aMap来存储您的数据。键应该是String对象,值应该是List对象。使用 aList作为映射条目值允许将多个值与单个键相关联。AList还将保持添加元素的顺序。

于 2013-01-03T03:14:18.013 回答
0
public static void main(String[] args) {

      Map<Integer,List<String>> map = new HashMap<Integer,List<String>>();

        //insert values into list one
        List<String> list1 = new ArrayList<String>();
        list1.add("AAA");
        list1.add("BBB");

        //insert values into list one
        List<String> list2 = new ArrayList<String>();
        list2.add("CCC");
        list2.add("GGG");

        //insert values to keys
        //single key multiple values
        map.put(1234567, list1);
        map.put(8765432, list2);

        //iterating and displaying the values
        for(Map.Entry<Integer,List<String>> entry: map.entrySet() ) {

            Integer key = entry.getKey();
            List<String> values = entry.getValue();
            System.out.println("Value of " +key+ " is " +values);
            //System.out.println("Value of " +key+ " is " +values.get(0));
            //System.out.println("Value of " +key+ " is " +values.get(1));

        }
}
于 2018-08-08T06:04:17.283 回答