我有一个方法strip(),这里是它的使用上下文:
public String strip(String data, String tag)
{
...
}
@param data a string where all open symbols such as [({ have a matching close somewhere after them.
@param tag an opening symbol(such as "["
@return a substring of the contents between the first given opening and the last corresponding closing character- with both characters removed.
example:
strip("caca blah blah [ hb {} ((stuff){okay} vv]","[")
should return "hb {}((stuff)(okay) vv"
我的问题 - 我有一个解决方案,但我试图找到一种方法来找到所给出的那个“相反”或结束的字符,而不用手工编码所有可能的组合。是否存在某种带字符编码的技巧或模式,或者某种实用方法可以做到这一点?
答案 0 :(得分:2)
手动定义“对立”字符,并不是很多。这可以通过Map,配对序列,交错序列,switch语句等完成。所有这些都可以隐藏在一个漂亮的整洁方法背后。
虽然我不推荐这个(真的,只是使用地图/开关)这个“有趣”的方法,有一个警卫,可以工作:
char closingOf(char c) {
String opens = "(<[{";
if (opens.indexOf(c) > -1) {
// For "why" this works, see an ASCII character table. YMMV when
// including other Unicode symbols.
return c + (c < '<' ? 1 : 2);
} else {
return 0; // you get nothing
}
}
这也可以通过配对序列完成:
String opens = "(<[{";
String closes = ")>]}";
int i = opens.indexOf(c);
return i > -1 ? closes.charAt(i) : 0;
或者使用交错序列:
String pairs = "()<>[]{}";
int i = pairs.indexOf(c);
return i > -1 && (i % 2) == 1 ? pairs.charAt(i + 1) : 0;
或部分扫描序列:
String pairs = ")>]}(<[{";
int i = pairs.indexOf(c, 4);
return i > -1 ? pairs.charAt(i - 4) : 0;
或者如果感觉很实际但很无聊(这种方法对于这种情况来说是一个好的竞争者,我可能会使用它;这个开关也很容易跟上,不像之前的一些“有趣”的例子):
switch (c) {
case '(': return ')';
case '<': return '>';
case '{': return '}';
case '[': return ']';
default: return 0;
}
答案 1 :(得分:1)
您可以使用小地图,例如:
HashMap<String, String> closingChar = new HashMap<>();
closingChar.put(")", "(");
closingChar.put("(", ")");
closingChar.put("}", "{");
closingChar.put("{", "}");
然后查找地图中的任何字符以查找相应的字符。上面的地图给出了开头一个给出的结束字符,反之亦然 - 如果你只需要前一个案例,第一个和第三个放置线。