方法:具有两个不同类的实例的Java数组

时间:2010-08-06 22:48:36

标签: java arrays

我正在尝试创建一个简单的正则表达式的东西供我自己使用,其中字符串中的字符可以是完全匹配,也可以是属于组的一组字符中的一个(例如,组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[]类型的数组。

5 个答案:

答案 0 :(得分:3)

您可以定义一个公共超类(接口),其中包含普通字符和字符类/组的子类。

答案 1 :(得分:1)

如果您需要混合数组或集合,则需要在公共接口或超类型后面抽象char / Character和Group。鉴于char是一个原语,而Character是一个最终类,编写一个接口并包装char / Character将是你最好的选择。

我建议将Group设为一个接口(可能重命名),然后创建两个实现Group的类 - 一个包装char或Character(让我们称之为SingleChar)和一个具体的Group(让我们称之为GroupImpl,现在),这是为了原始组的目的。创建一个Group []数组,并通过您的公共接口操作Group的每个实例。

答案 2 :(得分:0)

您无法使用两种不相关类型之一的元素定义数组。

您可以定义自己的超类型(或接口),从中扩展两个类,一个包装一个字符,另一个包含您的组。

或者,或许更简单,只需使用一个Object []并将其包含在具有智能的类中以放置/获取正确的类型。

答案 3 :(得分:0)

char []是无类型的,也许不是与之互动的最佳选择。

Group []并没有真正描述它的作用。

也许您可以使用方法“匹配”的接口,并在那里粘贴一堆实现此接口的对象。

因此,其中一个对象可能被实例化为“new MatchChar('a')”而另一个可能是“new MatchType(MatchType.CAPS)”。

问题在于它实例化并不是很容易 - 它很冗长。我会使用一种方法(在“匹配”里面说,它可能是MatchType和MatchChar的超类),就像getMatches一样,它将获取一个字符串并返回完全生成的数组。

我喜欢你的“语言”通常比正则表达式更明确,所以这样的事情:“[DIGIT] [DIGIT]。[DIGIT]”或“[CAPS] pple” - 加上强制性的“[ []“和”[]]“匹配大括号。

然后你的方法只是在字符串中查找匹配[],创建正确的MatchGroup对象,将剩余的字母转换为MatchChar对象并将它们返回给调用者。

解析像这样的字符串非常简单,事实上StringTokenizer会有一个球。

答案 4 :(得分:0)

您可以使用Composite设计模式来模拟这种情况。当您需要以相同的方式处理对象类型以及该类型的对象的集合时,此模式非常有用。您也可以使用Chain of Responsibility模式。

基本上你会定义这样的类(假设你需要一个matches()方法):

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 class。
  • 的实例
  • 实例将存储 内部的各个部分 array- {DIGITDIGIT.DIGIT}。
  • .将是Simple
  • 的一个实例
  • DIGIT将是一个实例 Group,将存储 12345678,{{ 1}},9 在其内部0
  • 该集合的每个元素都是 由一个实例代表 set
  • Simple将使用链 责任 - 委托 责任在链条上。

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

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