你想要的是一个多重映射,一个每个键可以有多个值的映射,因为每个类别可以有多个(描述符,值)对。在一些第三方 Java 库(如 Guava)中有多重映射,但您可以使用标准 Java 集合来模拟多重映射,方法是使用映射到值列表,例如 Map<String, List<Descriptor>>,其中 Descriptor 是一种包含一个(描述符,值)对。
在 Java 8 中添加到 Map 的 merge 方法对于构建这样的地图非常有效。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Objects;
import java.util.Map;
public class Descriptor {
private final String descriptor;
private final int value;
public Descriptor(String descriptor, int value) {
this.descriptor = Objects.requireNonNull(descriptor);
this.value = value;
}
public String getDescriptor() {
return descriptor;
}
public int getValue() {
return value;
}
@Override public String toString() {
return descriptor + ", " + value;
}
public static void main(String[] args) {
// create map (essentially a multimap
Map<String, List<Descriptor>> map = new HashMap<>();
insert(map, "Computers", "Keyboard", 10);
insert(map, "Computers", "Mouse", 5);
insert(map, "Cars", "Lamborghini", 6);
insert(map, "Cars", "BMW", 3);
// display all descriptors for a category
String category = "Cars";
for (Descriptor desc : map.get(category)) {
System.out.println(category + ", " + desc);
}
}
public static void insert(Map<String, List<Descriptor>> map,
String category, String descriptor, int value) {
// insert items in the map using Map.merge
List<Descriptor> list = new ArrayList<>();
list.add(new Descriptor(descriptor, value));
map.merge(category, list, Descriptor::concat);
}
public static List<Descriptor> concat(List<Descriptor> one,
List<Descriptor> two) {
one.addAll(two);
return one;
}
}
我假设您可以自己处理读取和解析输入文件,或者您打算单独解决这个问题,因为您的问题专门询问“HashMap 帮助”并说您在使用 HashMap 解决此问题时遇到问题.