我正在為子字串搜索實作一系列命令模式。我可以通過撰寫如下內容來靜態創建鏈:
matchChain = new CharMatcher( new DotMatcher( new CharMatcher(null)));
在那里我明確宣告字串中的每個字符將匹配模式 Character Period Character ("c.c")
但我的目標是為任何給定的鍵模式動態創建這個鏈。例如("\`\`cccc.cc\`\`*c")將是:
matchChain = new CharMatcher( new CharMatcher( new CharMatcher( new CharMatcher( new CharMatcher(new DotMatcher( new CharMatcher( new CharMatcher( new StarMatcher( new CharMatcher(null)))))));
所以 Chain 類是一個抽象類,每個匹配器類都擴展了 Chain。
那么如何根據給定鍵/模式的長度動態實體化一個鏈呢?
uj5u.com熱心網友回復:
考慮一個構建器方法(1):
public class ChainBuilder {
private static final char DOT ='.', STAR = '*';
public static void main(String[] args) {
String pattern = "cccc.cc*c";
Chain chain = chainBuilder(pattern);
//printout chain structure
String space ="", step =" ";
while (true){
if(chain == null){
System.out.println(space chain);
break;
}
System.out.println(space chain.getClass().getSimpleName());
space = step;
chain = chain.getNextLink();
}
}
private static Chain chainBuilder(String pattern){
Chain chain = null;
String reversePattern = new StringBuilder(pattern).reverse().toString();
for(char c : reversePattern.toCharArray()){
switch (c) {
case DOT:
chain = new DotMatcher(chain);
break;
case STAR:
chain = new StarMatcher(chain);
break;
default:
chain = new CharMatcher(chain);
break;
}
}
return chain;
}
}
class Chain {
private final Chain nextLink;
public Chain(Chain nextLink) {
this.nextLink = nextLink;
}
public Chain getNextLink() {
return nextLink;
}
}
class CharMatcher extends Chain{
public CharMatcher(Chain nextLink) {
super(nextLink);
}
}
class DotMatcher extends Chain{
public DotMatcher(Chain nextLink) {
super(nextLink);
}
}
class StarMatcher extends Chain{
public StarMatcher(Chain nextLink) {
super(nextLink);
}
}
(1)
發布的代碼是一個mre。將整個代碼復制粘貼到其中ChainBuilder.java并運行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/379551.html
