2010-08-06 111 views
2

我想创建一个简单的正则表达式类型的东西供我自己使用,其中字符串中的字符可以是完全匹配,也可以是属于一个组(例如,组CAPS将具有全部大写字符 - 'A','B'等)。因此,正则表达式(例如 - CAPS p p l e)应该匹配'Apple'或正则表达式(例如 - DIGIT DIGIT . DIGIT) - 应该与76.3匹配。方法:具有两个不同类的实例的Java数组

我想存储这个正则表达式模式在一个数组{CAPS, 'p', 'p', 'l', 'e'}。 现在,Java将允许我声明char[]/Character[]Group[]类型的数组,其中Group是我构建的代表这些字符组的类。如果我需要一个混合阵列能够存储上述模式,除了声明Object[]类型的数组外,还有什么其他选项?我真的不想处理Object[]类型的数组。

回答

0

可以采用Composite设计模式,这种情况建模。在需要以相同方式处理对象类型以及该类型对象的集合的情况下,此模式很有用。您也可以使用Chain of Responsibility模式。

基本上你会定义类这样(可以说,你需要一个匹配()方法):

class Pattern { 
    IPatternComponent[] pattern; 
    boolean matches(String str) { 
     for(int i = 0; i < str.length; i++) { 
      if(!pattern[i].matches(str.charAt(i))) 
       return false; 
     } 
     return true; 
    } 
} 

interface IPatternComponent { 
    boolean matches(char ch); 
} 

class Simple implements IPatternComponent { 
    char ch; 
    boolean matches(char ch) { 
     return (this.ch == ch); 
    } 
} 

class Group implements IPatternComponent { 
    Set<IPatternComponent> components; 
    boolean matches(char charToMatch) { 
     for(IPatternComponent comp : components) { 
      if(comp.matches(charToMatch) 
       return true; 
     } 
     return false; 
    } 
} 

服用DIGIT DIGIT . DIGIT例如:

  • 整个图案将被表示为 一个Pattern类的实例。
  • 实例将在 个别部分存储在其内部 阵列 - {DIGITDIGIT.DIGIT}。
  • .将是Simple一个实例。
  • DIGIT将是 Group一个实例,其中将存储 1234567890 在其内部set
  • 每个集合的元素是 由 Simple的实例表示。
  • matches()将使用责任链 工作 - 将权责下放到链中。

使用这种设计,你也可以很容易地定义ALPHANUMGroup,其内部设置包括ALPHABETSDIGITmatches()仍然可以工作。

注:我在这里直接编码的代码,因此它可能有错别字或小的错误。为了更好的可读性,我省略了构造函数。

+0

非常感谢。 – euphoria83 2010-08-08 17:33:45

3

您可以为普通字符和字符类/组定义一个公共超类(接口),并带有子类。

+0

需要注意的是,如果你把入阵的类型之一是基本类型,你必须使用相应的包装类型,使打字工作。这可能意味着公共超类(即数组元素类型)是'Object',并且您需要使用类型转换和'instanceof'来使用这些元素。 (@Peter - 随时在你的答案中加入这个) – 2010-08-07 01:28:37

+0

@Stephen,我的想法是简单地定义一个实现特定接口并包含原始值作为成员的类。显然,在我的回答中,我对此并不清楚 - 谢谢你指出了这一点。 – 2010-08-08 19:38:18

0

您不能使用两个不相关类型之一的元素定义数组。

您可以定义自己的超类型(或界面),从中扩展两个类,一个包装角色,另一个包含您的组。

或者,也许更容易,只是使用Object []并将其封装到具有智能的类中,以便放置/获取正确的类型。

1

如果你想要一个混合数组或集合,你将需要在通用接口或超类型后面抽象字符/字符和组。鉴于char是一个原始字符,Character是最后一个类,所以编写Interface和包装char/Character将是您最好的选择。

我建议让组接口(可能重命名它),然后创建两个类实现组 - 一个包装char或Character(我们称之为SingleChar)和一个具体组(我们称之为GroupImpl ,现在),服务于原始团队的目的。创建一个Group []数组,并通过您的通用界面操作Group的每个实例。

0

char []是无类型的,也许不是最好的交互方式。

Group []对于它的功能并没有真正的描述。也许你可以有一个接口与方法“匹配”,并坚持一堆在那里实现这个接口的对象。

所以这些对象中的一个可能被实例化为“新的MatchChar('a')”,而另一个可能是“新的MatchType(MatchType.CAPS)”。

这样做的问题是,它不是很容易实例化 - 它是冗长的。我会使用一个方法(比如在“匹配”中说,它可能是MatchType和MatchChar的超类),就像getMatches那样会接收一个字符串并返回完全生成的数组。 “DIGIT”[DIGIT]。[DIGIT]“或”[CAPS] pple“ - 再加上强制性的”语言“,比如正则表达式, [[]“和”[]]“以匹配大括号。

然后你的方法只是查找字符串匹配[],创建正确matchgroup的对象,变成其余字母为MatchChar对象并将其返回给调用者。

解析像这样的字符串是很容易的,事实上的StringTokenizer将具有与其球。

相关问题