如何在clojure中编写这个java代码(提示)

时间:2012-09-07 09:50:39

标签: clojure

问题

我正在学习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
*         &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);
    }
}

更新 我想重新创建这个类的功能

例如,您可以访问:Java Code Snippet: IntervalMap

4 个答案:

答案 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-classproxy