2

The question

I'm learning clojure and I love learning languages by example. But I do not like it just get a complete answer without me having to think about it.

So what I want is just some tips on what functions I might need and maybe some other clues.

The answer that I will accept is the one that gave me the necessary building blocks to create this.

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
*         &quot; k is the largest value while being smaller than 'key' &quot;
*/
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
    // &quot; k is the largest value while being smaller than 'key' &quot;

    // 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);
    }
}

Update I want to recreate the functionality of this class

For examples you can go here: Java Code Snippet: IntervalMap

4

4 回答 4

3

我会看一些组合:

  • (sorted-map & key-vals)- 将允许您创建按键排序的地图。您可以提供自己的比较器来定义顺序。

  • (contains? coll key)- 测试集合是否包含由参数标识的项目(当应用于向量时,这是一个常见的混淆来源,contains?如果在给定索引处存在元素而不是给定值,则返回 true)

  • (drop-while pred coll)允许您在谓词为真时跳过集合中的项目

于 2012-09-07T10:25:46.227 回答
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
于 2012-09-07T15:19:56.490 回答
2

我只会使用与函数相结合的地图来检索给定某个键的最接近的值。如果您想了解更多信息,请阅读地图和功能。

如果您希望能够改变 map 中的数据,请将 map 存储在 clojure 的可变存储设施之一中,例如 atom 或 ref。如果您想了解更多信息,请阅读可变数据。

您可以使用已关闭默认值和/或映射或引用映射的原子的函数。如果您想了解更多信息,请阅读闭包。

协议的使用在这里也可能派上用场。所以,也阅读一下。足够让你去吗?;-)

于 2012-09-07T10:21:58.917 回答
0

如果您想在 clojure 中“从概念上”实现代码块,那么现有答案已经回答了您的问题,但是如果您希望代码块在 clojure 中“结构上”相同(即子类化等),请查看gen-classproxy在 clojure 文档中。

于 2012-09-07T10:47:12.593 回答