我们是否可以实现一个包含一个键和两个值的HashMap.就像HashMap一样?

请帮帮我,也告诉我(如果没有办法)有没有其他方法来实现以一个为键的三个值的存储?

推荐答案

您可以:

  1. 使用具有列表作为值的映射.Map<KeyType, List<ValueType>>
  2. 创建一个新的包装器类,并在映射中放置该包装器的实例.Map<KeyType, WrapperType>
  3. 使用类似类的元组(省go 了创建大量包装器的麻烦).Map<KeyType, Tuple<Value1Type, Value2Type>>美元.
  4. 并排使用多张 map .

示例

1. Map with list as the value

// create our map
Map<String, List<Person>> peopleByForename = new HashMap<>();    

// populate it
List<Person> people = new ArrayList<>();
people.add(new Person("Bob Smith"));
people.add(new Person("Bob Jones"));
peopleByForename.put("Bob", people);

// read from it
List<Person> bobs = peopleByForename["Bob"];
Person bob1 = bobs[0];
Person bob2 = bobs[1];

这种方法的缺点是,列表不能精确绑定到两个值.

2. Using wrapper class

// define our wrapper
class Wrapper {
    public Wrapper(Person person1, Person person2) {
       this.person1 = person1;
       this.person2 = person2;
    }

    public Person getPerson1 { return this.person1; }
    public Person getPerson2 { return this.person2; }

    private Person person1;
    private Person person2;
}

// create our map
Map<String, Wrapper> peopleByForename = new HashMap<>();

// populate it
peopleByForename.put("Bob", new Wrapper(new Person("Bob Smith"),
                                        new Person("Bob Jones"));

// read from it
Wrapper bobs = peopleByForename.get("Bob");
Person bob1 = bobs.getPerson1;
Person bob2 = bobs.getPerson2;

这种方法的缺点是,必须为所有这些非常简单的容器类编写大量的boiler plate代码.

3. Using a tuple

// you'll have to write or download a Tuple class in Java, (.NET ships with one)

// create our map
Map<String, Tuple2<Person, Person> peopleByForename = new HashMap<>();

// populate it
peopleByForename.put("Bob", new Tuple2(new Person("Bob Smith",
                                       new Person("Bob Jones"));

// read from it
Tuple<Person, Person> bobs = peopleByForename["Bob"];
Person bob1 = bobs.Item1;
Person bob2 = bobs.Item2;

在我看来,这是最好的解决办法.

4. Multiple maps

// create our maps
Map<String, Person> firstPersonByForename = new HashMap<>();
Map<String, Person> secondPersonByForename = new HashMap<>();

// populate them
firstPersonByForename.put("Bob", new Person("Bob Smith"));
secondPersonByForename.put("Bob", new Person("Bob Jones"));

// read from them
Person bob1 = firstPersonByForename["Bob"];
Person bob2 = secondPersonByForename["Bob"];

这种解决方案的缺点是,这两个映射并不明显相关,编程错误可能会导致这两个映射不同步.

Java相关问答推荐

[145007:JC_ILLEGAL_SYMBOL_CHARACTER保存时:griddb中的牧师

在Java 8之后,HashMap的最坏情况下时间复杂度仍然是O(n)而不是O(log n)?

我的scala文件失败了Scala.g4 ANTLR语法

条件加载@ManyToMany JPA

Chunk(Int)已弃用并标记为要删除

Mapstruct不能正确/完全映射属性

对字符串长度进行排序,但颠倒了顺序(最长字符串在前)

内存和硬盘中的Zip不同,这会导致下载后的Zip损坏

try 从REST API返回对象列表时出错

如何在太阳系模拟器中添加月球?

当构造函数创建一个新实例时,Java为什么需要&new";

有谁能帮我修一下这个吗?使输出变得更加整洁

JOLT根据值删除并保留其余的json键

为什么我不能建立输入/输出流?Java ServerSocket

如何在Record Java中使用isRecord()和RecordComponent[]?

如何调整JButton的大小以适应图标?

在Java Spring JPA中插入包含对其他实体的引用的列

如何使用jOOQ在PostgreSQL中从枚举类型生成Java枚举

如何通过gradle命令行从build.gradle获得Java targetCompatibility

MapStruct记录到记录的映射不起作用