0

最初に言いたいのは、私は clojure を初めて使用するということです。次に、マップを反復処理してテーブル内のすべての要素を表示する方法を教えてください。これが私がやったことです。これは私の地図です-

(def kvote(assoc kvote (keyword kljuc){:id id :liga liga :dan dan :cas cas :domaciTim    domaciTim :gostujuciTim gostujuciTim :par par :konacanIshod{:1 jedinica :x nerijeseno :2 dvojka}}))

cldwalker テーブル関数を使用していて、これを行いました...

(table [ ["liga" "dan" "cas" "id" "par" "1" "X" "2"] [(:liga(get kvote(keyword :101)))
                                                     (:dan(get kvote(keyword :101)))
                                                      (:cas(get kvote(keyword :101)))
                                                    (:id(get kvote(keyword :101))) 
                                                    (:par(get kvote(keyword :101)))
                                                      (get-in kvote [:101 :konacanIshod :1])
                                                      (get-in kvote [:101 :konacanIshod :x])
                                                      (get-in kvote [:101 :konacanIshod :2])
                                                     ]] )

結果はこのようなものです...

+---------+---------+-------+-----+--------------------+-----+-----+---+
| liga    | dan     | cas   | id  | par                | 1   | X   | 2 |
+---------+---------+-------+-----+--------------------+-----+-----+---+
| Serie A | nedelja | 20:00 | 101 | Bologna - Cagliari | 1.5 | 2.3 | 4 |
+---------+---------+-------+-----+--------------------+-----+-----+---+

マップを反復処理して、特定のキーワードで 1 つだけでなく、すべての要素を表示するにはどうすればよいですか? どうにかしてキーワードの値を増やして、そのように表示できますか?

4

1 に答える 1

3

マップはSeqインターフェースを実装します。つまり、これらの便利な高階関数map( 、filterreduce、 ... など) をすべて使用してそれらを処理できます。ここで重要な部分は、マップの連続表現が[key value]ベクトルで構成されていることです。たとえば、次のようになります。

(seq {:a 0 :b 1})
;; => ([:a 0] [:b 1])

(map (fn [x] (inc (second x))) {:a 0 :b 1})
;; => (1 2)

(何をしているのかわからない場合はmap、それらを読んでください。(最終的には)気に入るはずです!)

さて、あなたの場合、キーではなく値にのみ関心があるようですので、valsそれらを取得します:

(vals {:a 0 :b 1})
;; => (0 1)

(map inc (vals {:a 0 :b 1}))
;; => (1 2)

ただし、値はマップ自体であり、そのマップ内の特定のキーにアクセスして、それらを単一のベクトル/リストに入れたいと考えています。出来るよ!

(map
  (fn [x]
    [(:key-1 x) (:key-2 x) ...])
  (vals your-map-of-maps))

これは退屈に見えます。しかし、内部の結果を作成することは、ハッシュ マップ内のキーのリスト (!) のそれぞれを検索することにほかなりませんmap

(map 
  (fn [x]
    (map (fn [k] (k x)) [:key-1 :key-2 ...]))
  (vals your-map-of-maps))

実際、Clojure を使用すると、さまざまな関数 (キーワードは関数です!) を同じ値に適用して、結果のリストを取得することが非常に簡単になりますjuxt。説明された。

(def inc-and-dec (juxt inc dec))
(inc-and-dec 1)
;; => [2 0]

そして、ここでマップに行きます:

((juxt :a :b) {:a 0 :b 1 :c 2})
;; => [0 1]

処理するのは大変ですが、Clojure が提供するツールを理解していないと、Clojure を効率的に使用することはできません。高レベルの関数は、おそらく最もよく使用するものです。最後に、テーブルを作成しましょう。

(table
  (cons
    ["header-1" "header-2" ...]
    (map (juxt :key-1 :key-2 ...) (vals your-map-of-maps))))

グランド フィナーレは、スレッド マクロを使用したクリーンアップです。

(->> your-map-of-maps
     (map (juxt :key-1 :key-2 ...))
     (cons ["header-1" "header-2" ...])
     (table))

うん、Clojure でできることはたくさんあり、シーケンス + 高階関数は非常に強力な組み合わせです。そして、テーブルの作成などの実用的な問題も解決します!

于 2013-11-08T18:56:06.290 に答える