将多个值与单个键关联,并保持值的顺序

时间:2013-01-03 03:09:33

标签: java

我有一个包含以下成员的课程

private String patientName;
private String patientPhoneNumber;

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

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

现在我想将它们存储在Map中,但是电话号码应该是具有多个值的键,对于1234567我应该具有值AAA和BBB,请告知我如何在地图中使用单个键存储多个值这里我的钥匙是电话号码然后请让我知道如果我想在控制台打印那么我会迭代地图

另外请不要我想要维护订单也请说首先我得到值AAA然后BBB所以我也应该保持这些顺序,因为我得到这只是一个例子,但在我的场景中我会得到这个来自后端的价值所以维持订单也是必要的请告知。

7 个答案:

答案 0 :(得分:2)

您可以尝试这样的事情:

HashMap<String,LinkedList<String>> map

答案 1 :(得分: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);

答案 2 :(得分: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);
}

答案 3 :(得分:1)

为每个值使用LinkedHashMapArrayList

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();
    }
}

答案 4 :(得分:1)

  

将多个值与单个键相关联

这是Multimap

  

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

来自Google Collections的

LinkedHashMultimap似乎符合要求:

  

实现不允许重复键值的Multimap   条目和返回其迭代器遵循的集合   将数据添加到多图的排序。

如果您不想添加依赖项,可以将集合用作值类型:

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

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

答案 5 :(得分:0)

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

答案 6 :(得分: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));

        }
}