Подбор потока для определенных условий - PullRequest
5 голосов
/ 24 мая 2011

Я ищу библиотеку Java, которая позволяет сопоставлять последовательность объектов, потенциально смешиваясь с сопоставителями, такими как Hamcrest.

В идеале я хотел бы написать тест, который может проверить, что итеративный объект содержит последовательность, которая будет выглядеть как регулярное выражение, но для объектов, а не символьных строк:

assertThat(myList).inSequence(oneOrMore(any()),zeroOrMore(equals(MyObject)));

Mockito с проверкой близок к тому, что я хотел бы, но некоторые простые сопоставления отсутствуют (например, zeroOrMore)

Александр

Ответы [ 3 ]

4 голосов
/ 27 июня 2011

Самое простое решение, которое я могу придумать, это построить строку с буквой для каждого объекта, а затем использовать регулярное выражение как обычно.

public boolean matchObjects() {
    Object a = new Object();
    Object b = new Object();
    Object c = new Object();
    Object d = new Object();
    ArrayList<Object> arrayList = new ArrayList<Object>();
    arrayList.add(a);
    arrayList.add(b);
    arrayList.add(c);
    arrayList.add(b);
    arrayList.add(d);
    Iterable<Object> iterable = arrayList;
    String result = "";
    for (Object object : iterable) {
        if (object.equals(a))
            result += "a";
        else if (object.equals(b))
            result += "b";
        else if (object.equals(c))
            result += "c";
        else if (object.equals(d))
            result += "d";
        else
            result += "x";
    }
    Pattern pattern = Pattern.compile("a.*b");
    return pattern.matcher(result).find();
}
3 голосов
/ 27 июня 2011

Взгляните на этот проект Google под названием ObjRegex . Это звучит как то, что я думаю, что вы ищете. Мне был очень интересен ваш вопрос, потому что я реализовал нечто подобное в C #, но это частная собственность, и я не могу поделиться этим.

1 голос
/ 27 июня 2011

Я думаю, что ваша проблема отличается от обычного сопоставления регулярных выражений в том, что у вас нет алфавита языка, пока вы не получите шаблон .Следовательно, вам нужно прочитать свой шаблон один раз, чтобы построить языковой алфавит.Исходя из вашего объяснения, я предполагаю, что конечный набор объектов являются базовыми элементами вашего языка.Получив список символов языка, вы можете использовать собственную реализацию сопоставления регулярных выражений или преобразовать свой поток и шаблон в строку (сопоставляя объекты в символы) и использовать один из доступных API регулярных выражений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...