Наборы персонажей - PullRequest
       17

Наборы персонажей

0 голосов
/ 24 августа 2009

Я использую лексический сканер. Как я могу реализовать наборы символов? большинство наборов символов будут в форме диапазона, т.е. A-Z, h-L e.t.c. И я должен проверить, если символ, ch является членом набора символов. Какую эффективную структуру данных я могу использовать в Java, кроме массивов и набора битов?

Ответы [ 6 ]

2 голосов
/ 24 августа 2009

Используйте HashSet вместе с "классом-оберткой" для char: java.lang.Character:

Set<Character> s = new HashSet<Character>();
s.add('a');
s.add('b');

и т.д.

2 голосов
/ 24 августа 2009

Рассматривали ли вы использовать генератор сканера, например JFlex ?
Вы указываете язык, который хотите сканировать, и JFlex создает для вас код Java.

1 голос
/ 24 августа 2009

Apache Commons Lang включает класс CharRange , который эффективно представляет непрерывные диапазоны символов без использования циклов, итераторов и множеств.

0 голосов
/ 24 августа 2009

Вы можете использовать HashSet напрямую, или вы можете создать класс-оболочку, подобный следующему, чтобы позволить вам создавать экземпляры множеств более кратко:

public class MyCharSet extends Set<Character> {
    /**
     * @param ranges an N x 2 array representing inclusive character ranges.
     */
    public MyCharSet(char[][] ranges) {
        super(intuitSize(ranges));
        for (char[] range : ranges) {
            for (char ch = range[0]; ch <= range[1]; ch++) {
                this.add(ch);
            }
        }
    }

    private static int intuitSize(char[][]ranges) {
        if (ranges.length == 0) {
            return 0;
        }
        int min = Integer.MAX_VALUE;
        int max = Integer.MIN_VALUE;
        for (char[] range : ranges) {
            if (range.length != 2 || range[0] > range[1]) {
                throw new IllegalArgumentException("bad range");
            }
            min = Math.min(ranges[0], min);
            max = Math.max(ranges[1], max);
        }
        return max - min;
    }
}
0 голосов
/ 24 августа 2009

Вы смотрели на ANTLR ?

0 голосов
/ 24 августа 2009

Вы можете создать объекты Set of Character и проверить с помощью метода contains.

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