如何将Set集合转换输出为逐行排列的简单字符串?
Set类型数据转逐行路径输出的实现方法
核心处理逻辑
你拿到的#{...}格式是类Clojure语法的Set默认序列化结果,要转成逐行路径格式,只需要三个步骤:
- 提取Set内的所有路径字符串元素,剔除集合包裹标记
#{}、元素外层的双引号 - 如果需要和示例输出的顺序一致,对提取到的路径按字典序排序(Set本身是无序结构,默认输出顺序不固定)
- 将处理完成的路径元素用换行符拼接为完整字符串输出
常见场景实现代码
场景1:直接操作内存中的Clojure原生Set对象
这种场景不需要做字符串解析,直接调用集合操作API即可:
;; 假设存储路径的Set变量绑定为path-set (->> path-set sort ;; 不需要排序可删除这一行 (clojure.string/join "\n") print)
场景2:拿到的是已经序列化好的Set字符串,需要解析转换
Python实现
import re set_serialize_str = '''#{"/Fotos/Mallorca-2017/dc-10.jpg" "/Fotos/Azoren-2018/buffet" "/Fotos/Azoren-2018/restaurant/dc-43.jpg" "/Fotos/Azoren-2018/restaurant/dc-42.jpg" "/Fotos/Mallorca-2017/dc-19.jpg" "/Fotos/Azoren-2018/restaurant/dc-41.jpg" "/Fotos/Mallorca-2017/dc-11.jpg" "/Fotos/Azoren-2018/restaurant/dc"}''' path_list = re.findall(r'"(.*?)"', set_serialize_str) print("\n".join(sorted(path_list)))
Java实现
import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class PathConvert { public static String convert(String setStr) { Matcher matcher = Pattern.compile("\"([^\"]+)\"").matcher(setStr); List<String> paths = new ArrayList<>(); while (matcher.find()) { paths.add(matcher.group(1)); } Collections.sort(paths); // 不需要排序可删除这一行 return String.join("\n", paths); } public static void main(String[] args) { String input = "#{\"/Fotos/Mallorca-2017/dc-10.jpg\" \"/Fotos/Azoren-2018/buffet\" \"/Fotos/Azoren-2018/restaurant/dc-43.jpg\" \"/Fotos/Azoren-2018/restaurant/dc-42.jpg\" \"/Fotos/Mallorca-2017/dc-19.jpg\" \"/Fotos/Azoren-2018/restaurant/dc-41.jpg\" \"/Fotos/Mallorca-2017/dc-11.jpg\" \"/Fotos/Azoren-2018/restaurant/dc\"}"; System.out.println(convert(input)); } }
注意事项
- 如果不需要匹配示例的排序结果,直接删除排序逻辑即可,按集合默认遍历顺序输出
- 操作内存中的Set对象时,直接遍历元素拼接即可,不要额外做序列化再正则解析的冗余操作
- 跨平台使用时注意换行符适配:Windows系统默认换行符为
\r\n,Linux、macOS系统默认换行符为\n
内容的提问来源于stack exchange,提问作者SunStorm
相关产品推荐
相关产品推荐

