首页 > 解决方案 > 按公共子字符串对字符串列表进行分组

问题描述

我有一个字符串列表,例如:

("2019_FOO_BAR.1_12"
 "2019_FOO_BAR.1_13"
 "2018_FOO_BAR.1_12"
 "2019_FOO_XYZ.1_14"
 "2017_FOO_BAR.1_14"
 "2017_FOO_XYZ.1_12"
 "2019_FOO_XYZ.1_13")

我想在第一个下划线和点之前按公共子字符串对它们进行分组。

在这个例子中,我有 2 个唯一的子字符串 FOO_BAR 和 FOO_XYZ。但更长的列表可能有 N 个唯一的子字符串。

我希望结果如下所示:

(["2019_FOO_BAR.1_12" "2019_FOO_BAR.1_13" "2018_FOO_BAR.1_12" "2017_FOO_BAR.1_14"]
 ["2017_FOO_XYZ.1_12" "2019_FOO_XYZ.1_13" "2019_FOO_XYZ.1_14"])

所以每个子字符串都分组在一个单独的列表中

标签: clojureclojurescript

解决方案


我想你正在寻找一个group-by

(def test-data '("2019_FOO_BAR.1_12"
                 "2019_FOO_BAR.1_13"
                 "2018_FOO_BAR.1_12"
                 "2019_FOO_XYZ.1_14"
                 "2017_FOO_BAR.1_14"
                 "2017_FOO_XYZ.1_12"
                 "2019_FOO_XYZ.1_13"))


(defn string-to-key [^String input-string]
  (let [first-spliter (.indexOf input-string "_" )
        second-spliter (.indexOf input-string "." )]
    (.subSequence input-string (+ 1 first-spliter) second-spliter)))

所以你可以得到你正在寻找的东西:

(vals (group-by string-to-key test-data))

推荐阅读