Nano Hash - криптовалюты, майнинг, программирование

Clojure — идиоматический способ писать «разделить первым» и «разделить последним»

Как можно было бы идиоматично написать следующую функцию?

(split-first #"." "abc.def.ghi") ;;=>["abc", "def.ghi"]
(split-last #"." "abc.def.ghi") ;;=>["abc.def", "ghi"]

Существует очевидное (уродливое?) решение с использованием split, но я уверен, что есть более элегантные решения? Может быть, используя regexes/indexOf/split-with?

30.06.2015

  • Разделить сначала просто (clojure.string/split "abc.def.ghi" #"\." 2) 30.06.2015
  • @cfrick Это очень элегантно. Если у вас есть что-то такое же хорошее для split-last, я с радостью приму ваш ответ. 30.06.2015

Ответы:


1

Для сплит-первого лучшим подходом будет:

(defn split-first [re s]
  (clojure.string/split s re 2))

(split-first #"\." "abc.def.ghi") 
=> ["abc" "def.ghi"]

(split-first #"<>" "abc<>def<>ghi")
=> ["abc" "def<>ghi"]

Один из подходов к разделению в последнюю очередь состоит в использовании утверждения отрицательного просмотра вперед:

(defn split-last [re s]
  (let [pattern (re-pattern (str re "(?!.*" re ")"))]
    (split-first pattern s)))

(split-last #"\." "abc.def.ghi")
=> ["abc.def" "ghi"]

(split-last #"<>" "abc<>def<>ghi")
=> ["abc<>def" "ghi"]
30.06.2015
  • Хорошая идея, но вам также придется использовать регулярное выражение reverse. Прямо сейчас ваше решение будет работать только для шаблонов палиндрома. 30.06.2015
  • Спасибо за отзыв - я переключился на решение с использованием отрицательного прогнозного утверждения. 01.07.2015

  • 2

    Если вам не обязательно нужно соответствие регулярному выражению, это сработает:

    (defn index-of
      [^String s c]
      (.indexOf s c))
    
    (defn last-index-of
      [^String s c]
      (.lastIndexOf s c))
    
    (defn split-at-index-fn
      [f c s]
      (let [i (f s c)]
        ; I do not know what you want returned if no match is found
        (when-not (neg? i)
          [(.substring s 0 i) (.substring s (inc i))])))
    
    (def split-first
      (partial split-at-index-fn index-of))
    
    (def split-last
      (partial split-at-index-fn last-index-of))
    

    Это не совсем идиоматично, потому что в основном это просто взаимодействие Java.

    30.06.2015
  • вы можете сохранить несколько символов, и если вам не нравится внешний вид взаимодействия, используйте subs вместо .substring, но не так 30.06.2015
  • когда совпадений не найдено, он должен возвращать пустой вектор (я думаю, что это наиболее логично, не стесняйтесь не соглашаться) 30.06.2015
  • @nha, хорошо, это довольно легко реализовать, изменив when-not на if-not и вернув пустой вектор в блоке else. 01.07.2015
  • @понзао верно. Но я бы хотел, чтобы он работал с регулярным выражением, если это возможно? 01.07.2015
  • Тогда эта реализация, к сожалению, не будет отвечать вашим требованиям, я думаю, решение @toolkit должно быть. 01.07.2015
  • В любом случае спасибо, может кому пригодится. +1 :) 01.07.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..