2

質問

私は 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 コード スニペット: IntervalMapを参照してください。

4

4 に答える 4

3

私はいくつかの組み合わせを見ています:

  • (sorted-map & key-vals)- キー順のマップを作成できます。独自のコンパレータを指定して順序を定義できます。

  • (contains? coll key)contains?- コレクションが引数で識別される項目を保持しているかどうかをテストします (これは、指定された値ではなく指定されたインデックスに要素がある場合に true を返すvector に適用された場合の一般的な混乱の原因です)

  • (drop-while pred coll)述語が true の間、コレクション内の項目をスキップできます

于 2012-09-07T10:25:46.227 に答える
2

関数と組み合わせたマップを使用して、特定のキーを指定して最も近い値を取得します。詳細を知りたい場合は、マップと関数について読んでください。

マップ内のデータを変更できるようにしたい場合は、マップを clojure の可変ストレージ機能の 1 つ (アトムや参照など) に格納します。詳細については、変更可能なデータについてお読みください。

デフォルト値および/またはマップまたはマップを参照するアトムを閉じた関数を使用できます。詳細を知りたい場合は、閉鎖についてお読みください。

ここでもプロトコルの使用が役立つ場合があります。だから、それについても読んでください。あなたを動かすのに十分ですか?;-)

于 2012-09-07T10:21:58.917 に答える
2

関数の実装で使用したいくつかのことinterval-get:

  • contains?は、@ sw1nn が提案したように、マップに特定のキーが含まれているかどうかを確認するのに最適です。
  • keysマップ内のすべてのキーを取得するために使用できます。
  • filterいくつかの述語を満たすシーケンス内のすべての要素を保持します。
  • sort、ご想像のとおり、シーケンスを並べ替えます。
  • lastシーケンスの最後の要素を返すnilか、シーケンスが空の場合。
  • if-letfalsey でない場合、値をバインドして作用させるために使用できます。

結果の関数の使用法は次のとおりです。

(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 に答える
0

コードブロックをclojureで「概念的に」実装したい場合、既存の回答はすでにあなたの質問に答えていますが、コードブロックをclojureで「構造的に」同じにしたい場合(つまり、サブクラス化など)は、見てgen-classproxyclojure のドキュメントで。

于 2012-09-07T10:47:12.593 に答える