我正在学习clojure,我喜欢通过实例学习语言。但我不喜欢它只是得到一个完整的答案,而我不必考虑它。
所以我想要的只是关于我可能需要什么功能的一些提示,也许还有其他一些线索。
我接受的答案是给我提供必要构建块的答案。
public class IntervalMap<K extends Comparable<K>, V> extends
TreeMap<K, V> {
V defaultValue = null;
public IntervalMap(V defaultValue) {
super();
this.defaultValue = defaultValue;
}
/**
*
* Get the value corresponding to the given key
*
* @param key
* @return The value corresponding to the largest key 'k' so that
* " k is the largest value while being smaller than 'key' "
*/
public V getValue(K key) {
// if it is equal to a key in the map, we can already return the
// result
if (containsKey(key))
return super.get(key);
// Find largest key 'k' so that
// " k is the largest value while being smaller than 'key' "
// highest key
K k = lastKey();
while (k.compareTo(key) != -1) {
k = lowerKey(k);
if (k == null)
return defaultValue;
}
return super.get(k);
}
@Override
public V get(Object key) {
return getValue((K) key);
}
}
更新 我想重新创建这个类的功能
例如,您可以访问:Java Code Snippet: IntervalMap
答案 0 :(得分:3)
我会看一下以下的组合:
(sorted-map & key-vals)
- 允许您创建按键排序的地图。你可以提供自己的比较器来定义订单。
(contains? coll key)
- 测试集合是否包含由参数标识的项目(当应用于向量时,这是混淆的常见原因,如果存在元素,则contains?
返回true给定的指数而不是给定的值)
(drop-while pred coll)
可让您在谓词为真时跳过集合中的项目
答案 1 :(得分:2)
我只是使用一个结合了函数的映射来检索给定某个键的最接近的值。如果您想了解更多信息,请阅读有关地图和功能的信息。
如果您希望能够改变地图中的数据,请将地图存储在clojure的一个可变存储设施中,例如atom或ref。如果您想了解更多信息,请阅读可变数据。
您可以使用已关闭超过默认值的函数和/或引用地图的地图或原子。如果您想了解更多信息,请阅读有关闭包的信息。
协议的使用在这里也可能派上用场。所以,请阅读相关内容。足够让你去? ; - )
答案 2 :(得分:2)
我在实现interval-get
函数时使用的一些内容:
contains?
与@ sw1nn建议一样,非常适合检查地图是否包含特定密钥。keys
可用于获取地图中的所有密钥。filter
保持序列中的所有元素都符合谓词。sort
会对序列进行排序。last
返回序列中的最后一个元素,如果序列为空,则返回nil
。if-let
可用于绑定和操作值。结果函数的用法如下:
(def m {0 "interval 1", 5 "interval 2"})
(interval-get m 3) ; "interval 1"
(interval-get m 5) ; "interval 2"
(interval-get m -1) ; nil
答案 3 :(得分:0)
如果你想在clojure中“概念性地”实现代码块,那么现有的答案已经回答了你的问题,但是如果你想让代码块在clojure中“结构上”相同(即子类化等),那么就有了在clojure文档中查看gen-class
和proxy
。