【问题标题】:What datatype to use in Java to match interval?在 Java 中使用什么数据类型来匹配区间?
【发布时间】:2015-04-10 13:42:47
【问题描述】:

我有一个实现非重叠范围的对象列表,例如:

1 to 10
11 to 20
21 to 50
51 to 100

他们提供min()max() 来检索这些值。

我需要一个数据存储来轻松检索正确的对象,给定一个必须在其区间内的值。

我能想到的最简单的方法是创建一个有序的数组列表,然后简单地遍历它,直到找到正确的间隔。所以在这种情况下,查找是在 O(N) 中完成的。

标准 Java 库中是否有更高效的数据结构来完成这项任务?

【问题讨论】:

  • 二分查找需要 O(log n)
  • 是的,但是java中是否有满足这个要求的标准数据结构?
  • 您的对象是否实现了 Comparable 接口,并在该字段上进行比较?你的对象是什么样的?
  • 我自己维护那个对象的类,所以我可以添加任何我想要的东西
  • Arrays.binarySearch() 怎么样?

标签: java data-structures


【解决方案1】:

您可以尝试使用NavigableMap,该方法在此答案中进行了说明:Using java map for range searches,即“无孔”方法。

使用 TreeMap 的示例实现:

// Create TreeMap
NavigableMap<Integer, MyInterval> map = new TreeMap<>();

// Putting values
map.put(interval1.min(), myInterval);
map.put(interval2.min(), myInterval);

// Retrieving values
int value = 15;
MyInterval interval = map.floorEntry(value).getValue();

// Check if value is smaller than max()
if (value <= interval.max())
    return interval;
return null;

【讨论】:

    【解决方案2】:

    无需重新发明轮子,Guava 提供了RangeRangeSetRangeMap 类。有关详细信息,请参阅Ranges Explained 文档。

    【讨论】:

    • 虽然这可能是一个很好的解决方案,但我要求的是标准的 Java 数据结构。
    • NavigableMap 也非常有用,但是将自己限制为“标准”数据结构是不必要的阻力。没有 Guava 就没有现代 Java 代码库是完整的(Guava 的大部分内容都进入了 Java 8)。
    • 我正在定制一个 ERP 系统。添加额外的库对我来说并非易事,这就是为什么我只有在必须的时候才会使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多