我正在尝试创建一种简单的正则表达式供我自己使用,其中字符串中的字符可以是完全匹配,也可以是属于一个组的一组字符中的一个(例如,Group CAPS将具有所有大写字符- 'A','B'等)。因此,例如-CAPS p p l e-的正则表达式应匹配“ Apple”,或例如-DIGIT DIGIT . DIGIT-的正则表达式应匹配76.3。

我试图将此正则表达式模式存储在数组{CAPS, 'p', 'p', 'l', 'e'}中。
现在,Java将允许我声明一个char[]/Character[]Group[]类型的数组,其中Group是我构造的代表此类字符组的类。如果我需要一个混合数组来存储上述模式,除了声明类型为Object[]的数组之外,我还有其他选择吗?

我真的不想处理类型为Object[]的数组。

最佳答案

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

基本上,您将定义这样的类(假设您需要match()方法):

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()将使用链条工作
责任-委托
责任链。


使用此设计,您还可以轻松地将ALPHANUM定义为Group,其内部集由ALPHABETSDIGIT组成,并且matches()仍然可以使用。

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

关于java - 方法:具有两个不同类的实例的Java数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3428330/

10-13 01:42