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

Java 将多个值与单个键关联,并保持值的顺序,java,Java,我有一个包含以下成员的类 private String patientName; private String patientPhoneNumber; 现在我有多个名字和电话号码。例如 1234567, AAA 1234567, BBB 8765432, CCC 8765432, GGG 现在我想将它们存储在地图中,但电话号码应该是具有多个值的键,对于1234567,我应该具有值AAA和BBB,请告知如何在地图中使用单个键存储多个值这里我的键是电话号码。然后请让我知道是否要在控制台中打印,然

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

private String patientName;
private String patientPhoneNumber;
现在我有多个名字和电话号码。例如

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

另外,请注意,我不想维护订单,也可以说,首先我得到值AAA,然后是BBB,因此我也应该维护这些订单,因为我得到的只是一个示例,但在我的场景中,我将从后端获得此值,因此维护订单也是必要的,请告知。

对每个值使用a和a:

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();
    }
}
对每个值使用a和a:

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();
    }
}
使用地图存储数据。键应该是字符串对象,值应该是列表对象。使用列表作为映射条目值允许将多个值与单个键关联。列表还将保持添加元素的顺序。

使用地图存储数据。键应该是字符串对象,值应该是列表对象。使用列表作为映射条目值允许将多个值与单个键关联。列表还将维护添加元素的顺序

将多个值与单个键关联

这是一个:

类似于映射的集合,但可以将多个值与单个键关联

Google Collections似乎符合这一要求:

不允许重复键值的多重映射的实现 返回迭代器跟随 将数据添加到多重映射的顺序

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

Map<String /*number*/, List<String> /*names*/> numbers;
请注意,前者只允许按插入顺序检索,如果您希望能够更改它,则必须使用后一种手动解决方案

将多个值与单个键关联

这是一个:

类似于映射的集合,但可以将多个值与单个键关联

Google Collections似乎符合这一要求:

不允许重复键值的多重映射的实现 返回迭代器跟随 将数据添加到多重映射的顺序

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

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

请注意,前者仅允许按插入顺序检索,如果您希望能够更改它,则必须使用后一种手滚解决方案,您可以尝试以下操作:

HashMap<String,LinkedList<String>> map

您可以尝试以下方法:

HashMap<String,LinkedList<String>> map
如果需要不区分大小写的排序,可以像这样添加:

TreeSet<String> nameSet = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
phoneBook.add(number, nameSet);
如果需要不区分大小写的排序,可以像这样添加:

TreeSet<String> nameSet = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
phoneBook.add(number, nameSet);

您可以让地图返回其他集合,而不仅仅是基本类型让地图根据需要返回列表或集合,这将允许您将多个值与一个键相关联。@BevynQ我请求您发布一段代码片段,以使理解更清晰您可以让映射返回其他集合,而不仅仅是基本类型让映射返回列表或集合,这取决于您需要什么,这将允许您将多个值与一个键相关联。@BevynQ我请求您发布一段代码快照,以使理解更清晰,clearOP希望保留每个键中值的顺序,不是键本身的顺序。@YanickRochon非常感谢我们是否也有java中的linkedHashMap多值映射之类的东西,比如说我在另一个场景中使用了值为整数映射多值映射=新HashMap@user1924563,是的,你可以使用任何类似的类型。@可能很糟糕,但它几乎和常规哈希映射一样快,所以它是一个无需花费太多的值加号。@YanickRochon但我唯一担心的是我也想保持值的顺序。OP想保持每个键中值的顺序,不是键本身的顺序。@YanickRochon非常感谢我们有linkedHashMap多值映射吗

g也在java或not中,假设我使用了另一个场景,其中值是整数映射multiValueMap=newhashmap@user1924563,是的,你可以使用任何类似的类型。@也许很糟糕,但它几乎和常规哈希映射一样快,所以它是一个无需花费太多的值加号。@YanickRochon但我唯一担心的是我也想保持值的顺序。它保持自然顺序,或者给定一个比较器,但不是插入的顺序。@MouseEvent我想实现这一点。。!!保留每个字段中值的顺序key@YanickRochon假设它是一个电话簿,插入顺序将不会起很大作用。@MouseEvent,也许,但是您必须指定一个自定义比较器,因为值不一定是字符串。它保持自然顺序,或者给定一个比较器,但不是插入的顺序。@MouseEvent我想实现这一点。。!!保留每个字段中值的顺序key@YanickRochon假设它是一个电话簿,插入顺序不会起很大作用。@MouseEvent,也许吧,但是您必须指定一个自定义比较器,因为值不一定是字符串。谢谢,另外,请告知,因为我也想保留每个键中的值顺序,所以这种方法也适用于其他存储库,也请告知,因为我也想保留每个键中的值顺序,所以这种方法也适用于其他存储库,因为日志集合已经好几年没有维护了。你是说番石榴吗?谷歌收藏已经好几年没有维护了。你是说番石榴吗?