如何在Java中使用自定义比较器来定义嵌套映射的最内层映射?

问题描述 投票:0回答:1

我在 Java 中有一个 Range 类和一个比较器:

class Range{
    int start;
    int end;
}

class RangeComparator implements Comparator<Range> {
  @Override
  public int compare(Range range1, Range range2) {
    //implementation
  }
}

还有另一个具有嵌套映射的类;

class MyClass{
    private static Map<String, Map<String, Map<Range, List<String>>>> nestedMap;
}

我需要:

  • nestedMap 的最里面的映射是一个 TreeMap,它使用 RangeComparator 对其键进行排序,并且
  • 创建 MyClass 的对象时,nestedMap 为空,并且
  • 最里面的映射具有在将条目插入映射时使用特定比较器的属性。

如何实现?

在C++中,可以通过在nestedMap的声明中指定比较器来实现,如下所示:

struct Comp {
  const bool operator()(const Range& range1, const Range& range2) const {
    // implementation
  }
};

class MyClass{
  map<string, map<string, map<Range, vector<string>, Comp>>> nestedMap;
};

我想知道如何在 Java 中实现同样的目标。

java dictionary comparator
1个回答
1
投票

您只能直接初始化最外层的映射,内部映射与一个键相关联,每个键都有自己的映射作为值。除非你事先知道按键并提前初始化,否则这是不可能的。

但是,只有在请求密钥时缺少值时,您才可以使用 Map.computeIfAbsent() 进行初始化。

如果指定的键尚未与值关联(或映射为 null),则尝试使用给定的映射函数计算其值并将其输入到此映射中,除非 null。

nestedMap
  .computeIfAbsent("key", key -> new HashMap<>())
  .computeIfAbsent("nextKey", key -> new TreeMap<>(new RangeComparator()));
© www.soinside.com 2019 - 2024. All rights reserved.