gpt4 book ai didi

java - 如何在 Java 中实现字符串格式化机制?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:18:36 25 4
gpt4 key购买 nike

我正在尝试制作一个字符串格式化机制,它看起来很像 Winamp Advanced Title Formatting .

我有一些绑定(bind)到对象属性的“变量”(或元数据字段),格式为 %varname%。因此,例如,%title% 元数据字段绑定(bind)到歌曲标题,比如“征服天堂”,%artist% 元数据字段绑定(bind)到歌曲艺术家,例如“Vangelis”,%feat% 元数据字段绑定(bind)到特色艺术家,例如“English Chamber Choir”。

现在我想根据给定的格式显示歌曲,例如:

%title%[ (by %artist%[ featuring %feat%])]

方括号表示除非设置了方括号内的(所有)元数据,否则不显示。应该可以嵌套方括号。
所以上面提到的格式化字符串说:显示元数据字段 %title% 并且,如果设置了 %artist% (不是空字符串),显示 (by %artist %),但如果 %feat% 元数据字段也非空,则也显示该字段。在上面的例子中,它将变成:

Conquest of Paradise (by Vangelis featuring English Chamber Choir)

现在我该如何制作这样的机制?我从哪里开始?

我想我必须对字符串进行标记,然后按“部分”搜索元数据标签?

最佳答案

我会构建一个代表模式的树结构。对于您的示例,它看起来像:

root
+ variable (title)
+ group
+ text (" (by ")
+ variable (artist)
+ group
+ text (" featuring ")
+ variable (feat)
+ text (")")

然后,当您根据树评估元数据时,您会在组级别存储是否评估了组中的所有变量和子组,如果是,则使用文本。

你的树类看起来像这样:

interface Node { String evaluate(Map<String, String> metaData); }

class Group implements Node
{
private final List<Node> _children;

Group(final List<Node> children) { _children = children; }

@Override
public String evaluate(final Map<String, String> metaData)
{
final StringBuilder sb = new StringBuilder();
for (final Node node : _children)
{
final String subText = node.evaluate(metaData);
if (subText == null)
return null;
sb.append(subText);
}
return sb.toString();
}
}

class Text implements Node
{
private final String _text;

Text(final String text) { _text = text; }

@Override
public String evaluate(final Map<String, String> metaData)
{
return _text;
}
}

class Variable implements Node
{
private final String _variable;

Variable(final String variable) { _variable = variable; }

@Override
public String evaluate(final Map<String, String> metaData)
{
return metaData.get(_variable);
}
}

剩下要做的就是弄清楚如何解析字符串以创建树结构。

关于java - 如何在 Java 中实现字符串格式化机制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15827593/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com