如何在每个字符串的前面加上定界符来连接字符串向量?

时间:2019-11-27 04:59:21

标签: clojure

我正在寻找类似join的东西,但是分隔符放在每个字符串的前面,而不仅仅是充当分隔符。

作为一个简单的例子,我正在寻找一个不太丑陋的版本:

(def params [1 2 3 4])
(clojure.string/join (for [x params] (str "&param=" x)))

结果

"&param=1&param=2&param=3&param=4"

3 个答案:

答案 0 :(得分:4)

不带分隔符的呼叫(clojure.string/join coll)(apply str coll)一样,这是一个小小的胜利:

(apply str (for [x params] (str "&param=" x)))

那么您可能更喜欢map,而不是for

(apply str (map #(str "&param=" %) params))

interleave可以工作:

(apply str (interleave (repeat "&param=") params))

您可以将其重构为分隔前缀,并使用以下字符串interleave

(apply str
       (interleave (repeat \&)
                   (map #(str "param=" %) params)))

您可能喜欢穿线的外观:

(->> (map #(str "param=" %) params)
     (interleave (repeat \&))
     (apply str))

您可以提取一个函数来更一般地执行此操作:

(defn prepend-join [separator & cs]
  (apply str (apply interleave (repeat separator) cs)))

(prefix-join \& (map #(str "param=" %) params))

答案 1 :(得分:3)

,此外: clojure的核心库中有一个方便的函数,即apply plugin: 'com.android.library' apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' apply plugin: 'kotlin-android-extensions' android { compileSdkVersion 28 buildToolsVersion "28.0.3" compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } defaultConfig { minSdkVersion 23 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles 'consumer-rules.pro' } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } debug { shrinkResources false minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } externalNativeBuild { cmake { path file('CMakeLists.txt') } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' testImplementation 'junit:junit:4.12' implementation 'com.google.android.material:material:1.0.0' implementation 'com.jakewharton:butterknife:10.0.0' annotationProcessor 'com.jakewharton:butterknife-compiler:10.0.0' implementation 'androidx.core:core-ktx:1.0.2' androidTestImplementation 'androidx.test:runner:1.1.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation 'io.reactivex.rxjava2:rxandroid:2.1.0' implementation 'io.reactivex.rxjava2:rxjava:2.2.0' kapt "com.jakewharton:butterknife-compiler:10.0.0" kapt 'androidx.databinding:databinding-compiler:3.5.0' implementation project(':openCVLibrary345') }

clojure.pprint/cl-format

谈论它的功能,它只是冰山一角

答案 2 :(得分:2)

params前面加上一个空字符串对我来说似乎很干净:

(clojure.string/join "&param=" (cons "" params))
;;=> "&param=1&param=2&param=3&param=4"