当前位置: 首页 > 面试题库 >

实施一个地图,其中键是一组非重叠范围

梁韬
2023-03-14
问题内容

我目前使用List和循环的实现遇到性能问题。我正在考虑进行一些自定义Map但是否可以正确覆盖getter以便与以下设置一起使用:

Map包含自定义对象,键可以如下:

case A key: "10"
calling get("10") would return matching object

case B key: "10;12;14"
calling get("10"),get("12"),get("14") would return same object

case C key: "10;20-30"
calling get("10"), get(value between 20 and 30) would return same object

在这种情况下使用地图是最好的方法,有什么替代方法?

谢谢。


问题答案:

更新: 添加了完整的实现

更新2: 如果需要,可以按照注释中的建议将RangeMap用于内部theMap

如果键范围不重叠,则可以创建一个自定义容器,该容器内部TreeMap使用以下实现的自定义键存储数据Comparable

class MyStorage<T> {
    private static final class Range implements Comparable<Range> {
        private int first;
        private int last;

        public Range(int first_, int last_) {
            first = first_;
            last = last_;
        }

        // This heavily relies on that the ranges don't overlap
        @Override public int compareTo(Range other) {
            if (last < other.first)
                return -1;
            if (first > other.last)
                return 1;
            return 0;
        }
    }

    private Map<Range, T> theMap = new TreeMap<Range, T>();

    public void put(String key, T obj) {
        String[] ranges = key.split(";");
        for (String range : ranges) {
            //System.out.println("Adding " + range);
            String[] bounds = range.split("-");
            //System.out.println("Bounds " + bounds.length);
            int first = Integer.parseInt(bounds[0]);
            if (bounds.length == 1)
                theMap.put(new Range(first, first), obj);
            else 
                theMap.put(new Range(first, Integer.parseInt(bounds[1])), obj);
        }
    }

    public T get(String key) {
        return get(Integer.parseInt(key));
    }

    public T get(int key) {
        return theMap.get(new Range(key, key));
    }
}

class Main
{
    public static void main (String[] args) throws java.lang.Exception
    {
        MyStorage<Integer> storage = new MyStorage<Integer>();
        storage.put("10;20-30", 123);
        storage.put("15;31-50", 456);

        System.out.println(storage.get("42"));
    }
}


 类似资料:
  • 问题内容: 我想使用Python表示一组整数范围,其中该集合可以动态修改并进行包含测试。具体来说,我想将其应用于文件中的地址范围或行号。 我可以定义要关注的地址范围: 然后,我希望能够向集合中添加一个潜在的重叠范围,以便在添加集合时变为: 但是然后可以从集合中删除我可以排除范围的集合,集合变成: 最后,我希望能够遍历集合中包含的所有整数,或测试集合是否包含特定值。 我想知道执行此操作的最佳方法是什

  • 在javascript中,我有两个映射map1={a:1,b:2,c:3,d:4,e:5};map2={td:a,bd:c,sd:e}; 现在我需要搜索map2的值,即(a,b,e),如果它是map1的键,然后用map1示例中的对应值更新map2的值——map2[td]=a和map[a]=1,然后我想更新map2[td]=1。谁能帮我找到一个算法吗。

  • 问题内容: for (Entry entry : map.entrySet()) { Double key = entry.getKey(); String value = entry.getValue(); 迭代地图时是否可以知道上一个元素和下一个元素是什么? 问题答案: 您可以使用此方法,它的迭代器以升序顺序返回条目: 每个条目检索都是O(logN),因此对于完整迭代而言,这不是最有效的方法。

  • 我为我的处理器编程了多种方法,例如: 问题是r.Form始终是一个空映射,在我的删除请求中,我以JSON格式发送Id,如下所示: 在main方法中,我注册了如下处理程序方法: 为什么r.Form和r.PostForm总是一张空地图?

  • 这与我想要的不同,因为它是作为JSON的每个单独行的数组。我想要一个json(不是数组),其中列是键,数组是值。我怎么能那么做?

  • 问题内容: 我有两个div元素。他们每个人都有450px的宽度和高度。如何检查第一个div是否与第二个div重叠? 我尝试使用javascript hittest,但是有点复杂。由于我试图找出其实际工作方式,因此我想从一个简单的代码开始。 我发现可以使用 .getClientRects 来获取元素的边界,但是我不确定如何比较边界。 请给我提意见! 问题答案: 类似这样的东西,并通过getBound