Clojure:あるベクトルの要素を他のベクトルに取り込む方法

私はClojureにはとても不慣れで、ベクトル/リスト/マップの操作を理解するのが困難です。データ内のすべての顧客の名前を印刷しようとしていますが、その方法がわかりません。助けてください。

(def data
"1|John Smith|123 Here Street|456-4567
2|Sue Jones|43 Rose Court Street|345-7867
3|Fan Yuhong|165 Happy Lane|345-4533")

(defn test
[]
  (let [lines       (str/split-lines data)
        line-vecs-1 (mapv #(str/split % #"\|" ) lines)]
       (for [x line-vector-c] (print (line-vector-c 1))
       )
  )
)

私にくれます:

 [2 Sue Jones 43 Rose Court Street 345-7867][2 Sue Jones 43 Rose Court Street 
 345-7867][2 Sue Jones 43 Rose Court Street 345-7867]

私が欲しいもの:

"John Smith"
"Sue Jones"
"Fang Yuhong"
0
line-vector-c が定義されていません。また、 for は遅延するため、印刷などの副作用にはお勧めできません。代わりに doseq を使用してください。
追加された 著者 exupero,
line-vector-c が定義されていません。また、 for は遅延するため、印刷などの副作用にはお勧めできません。代わりに doseq を使用してください。
追加された 著者 exupero,
他の似たような質問をすべて見たことがありますか。多くの人が同じクラスにいるか、同じ宿題をしているようです。 Clojureタグをクリックし、質問を見てください。これは基本的にすでに数回回答されているためです。
追加された 著者 Carcigenicate,
一般に、データはClojureのデータ構造、この場合はベクトルまたは一連のマップにあると考えるのが最善です。次に、問題は2つに分かれます。1.データをそのような形式にすることと、2.答えを導き出して出すこと。
追加された 著者 Thumbnail,
一般に、データはClojureのデータ構造、この場合はベクトルまたは一連のマップにあると考えるのが最善です。次に、問題は2つに分かれます。1.データをそのような形式にすることと、2.答えを導き出して出すこと。
追加された 著者 Thumbnail,

8 答え

あなたがこれまでに手に入れたもの(わずかに書き直されました):

(mapv (fn [l]
        (str/split l #"\|"))
      (str/split-lines data))

(str/split-lines data) splits the lines into a sequence of strings:

["1|John Smith|123 Here Street|456-4567"
 "2|Sue Jones|43 Rose Court Street|345-7867"
 "3|Fan Yuhong|165 Happy Lane|345-4533"]

(mapv #(str/split % #"\|") lines) splits each line into tuples of strings:

[["1" "John Smith" "123 Here Street" "456-4567"] 
 ["2" "Sue Jones" "43 Rose Court Street" "345-7867"]
 ["3" "Fan Yuhong" "165 Happy Lane" "345-4533"]]

今度は、文字列の各タプルを各タプルの2番目の要素だけに変換します。そのために使用できる関数がいくつかあります。 get または nth (どちらもゼロベース)。

例えば:

(mapv (fn [l]
        (get (str/split l #"\|")
             1))
      (str/split-lines data))
3
追加された

あなたがこれまでに手に入れたもの(わずかに書き直されました):

(mapv (fn [l]
        (str/split l #"\|"))
      (str/split-lines data))

(str/split-lines data) splits the lines into a sequence of strings:

["1|John Smith|123 Here Street|456-4567"
 "2|Sue Jones|43 Rose Court Street|345-7867"
 "3|Fan Yuhong|165 Happy Lane|345-4533"]

(mapv #(str/split % #"\|") lines) splits each line into tuples of strings:

[["1" "John Smith" "123 Here Street" "456-4567"] 
 ["2" "Sue Jones" "43 Rose Court Street" "345-7867"]
 ["3" "Fan Yuhong" "165 Happy Lane" "345-4533"]]

今度は、文字列の各タプルを各タプルの2番目の要素だけに変換します。そのために使用できる関数がいくつかあります。 get または nth (どちらもゼロベース)。

例えば:

(mapv (fn [l]
        (get (str/split l #"\|")
             1))
      (str/split-lines data))
3
追加された

あなたが使用して名前のリストを取得することができます

(def names
  (sequence
    (comp
      (map #(str/split % #"\|"))
      (map second))
    (str/split-lines data)))

それからそれぞれの名前を

(doseq [n names]
  (println n))

一度に1ステップずつ変換を構築するのに便利なので、私はよく sequence と合成トランスデューサーを使ってデータを探索します。

1
追加された

あなたが使用して名前のリストを取得することができます

(def names
  (sequence
    (comp
      (map #(str/split % #"\|"))
      (map second))
    (str/split-lines data)))

それからそれぞれの名前を

(doseq [n names]
  (println n))

一度に1ステップずつ変換を構築するのに便利なので、私はよく sequence と合成トランスデューサーを使ってデータを探索します。

1
追加された

RegExを使う:

(地図 second (再要求 #"\|(.*?)\|" data))

以下を返します。

("John Smith" "Sue Jones" "Fan Yuhong")

説明する:

再要求

We ask 再要求 to find at each line the first content between a pair of |. The ? in the regex means we want a non greedy search.

(再要求 #"\|(.*?)\|" data)

以下を返します。

(["|John Smith|" "John Smith"] ["|Sue Jones|" "Sue Jones"] ["|Fan Yuhong|" "Fan Yuhong"])

地図

Finally, we use 地図 second to visit each element of the list and get only the second string of the vector.

0
追加された

RegExを使う:

(地図 second (再要求 #"\|(.*?)\|" data))

以下を返します。

("John Smith" "Sue Jones" "Fan Yuhong")

説明する:

再要求

We ask 再要求 to find at each line the first content between a pair of |. The ? in the regex means we want a non greedy search.

(再要求 #"\|(.*?)\|" data)

以下を返します。

(["|John Smith|" "John Smith"] ["|Sue Jones|" "Sue Jones"] ["|Fan Yuhong|" "Fan Yuhong"])

地図

Finally, we use 地図 second to visit each element of the list and get only the second string of the vector.

0
追加された

各行を分割して、このように2番目の列を取得する

(defn test [xs]
    (->> (str/split-lines xs)       ;split lines
         (map #(str/split % #"\|")) ;get columns
         (map second)))             ;only the second element of each line

そして結果を印刷する

(map println (test data))

印刷専用に doseq を使用することをお勧めします。

(doseq [n (test data)]
  (println n))
0
追加された

各行を分割して、このように2番目の列を取得する

(defn test [xs]
    (->> (str/split-lines xs)       ;split lines
         (map #(str/split % #"\|")) ;get columns
         (map second)))             ;only the second element of each line

そして結果を印刷する

(map println (test data))

印刷専用に doseq を使用することをお勧めします。

(doseq [n (test data)]
  (println n))
0
追加された