Сгладить вложенную карту в строки [duplicate]

Он делает это, потому что input.nextInt(); не фиксирует новую строку. вы могли бы сделать, как и другие, добавив под ним input.nextLine();. В качестве альтернативы вы можете сделать это в стиле C # и разобрать nextLine на целое число так:

int number = Integer.parseInt(input.nextLine()); 

Выполнение этого работает так же хорошо, и оно сохраняет строку кода.

2
задан ClojureMostly 29 September 2015 в 22:58
поделиться

2 ответа

Вариант, который, по моему мнению, более приятный, используя for вместо mapcat:

(defn flatten-keys [m]
  (if (not (map? m))
    {[] m}
    (into {}
          (for [[k v] m
                [ks v'] (flatten-keys v)]
            [(cons k ks) v']))))

Функция естественно рекурсивна, и наиболее удобным базовым случаем для не-отображения является «это одно значение, без ключа, ведущего к нему». Для карты вы можете просто вызвать flatten-keys для каждого значения на карте и добавить свой ключ к каждому ключевому слову результирующей карты.

3
ответ дан amalloy 28 August 2018 в 02:54
поделиться

Похоже, это в основном сглаживание вложенных ключей. Это также кажется проблемой 4clojure .

Поиск сглаживания карты на github дает много результатов.

Один пример реализация:

(defn flatten-map 
  "Flattens the keys of a nested into a map of depth one but 
   with the keys turned into vectors (the paths into the original 
   nested map)."
  [s]
  (let [combine-map (fn [k s] (for [[x y] s] {[k x] y}))]
    (loop [result {}, coll s]
      (if (empty? coll)
        result
        (let [[i j] (first coll)]
          (recur (into result (combine-map i j)) (rest coll)))))))

Пример

(flatten-map {:OUT
              {:x 5
               :x/A 21
               :x/B 33
               :y/A 24}})
=> {[:OUT :x] 5, [:OUT :x/A] 21, [:OUT :x/B] 33, [:OUT :y/A] 24}

Еще более общая версия от Christoph Grand:

(defn flatten-map
  "Take a nested map (or a nested collection of key-value pairs) and returns a
   sequence of key-value pairs where keys are replaced by the result of calling
   (reduce f pk path) where path is the path to this key through the nested
   maps."
  ([f kvs] (flatten-map f nil kvs))
  ([f pk kvs]
   (mapcat (fn [[k v]]
             (if (map? v)
               (flatten-map f (f pk k) v)
               [[(f pk k) v]])) kvs)))

Пример:

(flatten-map conj [] {:OUT
              {:x 5
               :x/A 21
               :x/B 33
               :y/A 24}})
=> ([[:OUT :x] 5] [[:OUT :x/A] 21] [[:OUT :x/B] 33] [[:OUT :y/A] 24])
2
ответ дан ClojureMostly 28 August 2018 в 02:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: