Генерация буквенной последовательности в Java - PullRequest
20 голосов
/ 03 января 2012

Я ищу способ генерации буквенной последовательности:

A, B, C, ..., Z, AA, AB, AC, ..., ZZ.

Может кто-нибудь предложить удобный способ сделать это.Какие структуры данных я могу использовать?

Я бы хотел методы, которые получают следующий код в последовательности, а затем сбрасывают последовательность.

Ответы [ 16 ]

0 голосов
/ 22 февраля 2019

Все эти длинные ответы ... и те, которые используют рекурсию ... вау.Это может быть сделано в Java в несколько строк без рекурсии:

private static String intToValueKey(int value) {
    final StringBuilder sb = new StringBuilder(String.valueOf((char)('A'+(value % 26))));
    while((value = (value/26-1)) >= 0) {
        sb.append((char)('A'+(value % 26)));
    }
    return sb.reverse().toString();
}

Затем вы просто вызываете метод с увеличением числового значения в цикле, чтобы сгенерировать последовательность от 0 до n.

for(int i=0; i<800; i++) {
    System.out.println(intToValueKey(i));
}

Обратное () в конце просто, если вы заботитесь о порядке букв и не нужно, если вы просто ищете уникальную перестановку.

0 голосов
/ 24 октября 2018

Я не знаком с функциональным программированием на Java, но я предполагаю, что вы могли бы сделать что-то эквивалентное этому коду в Haskell:

- создать список ["A" .. "Z"]

uca = map (: []) ['A' .. 'Z']

- декартово произведение двух списков строк, ++ объединяет две строки

cp lst1 lst2 =

    [x ++ y | x <- lst1, y <- lst2]

- следующий список дает необходимый список строк

uca ++ cp uca uca

0 голосов
/ 19 октября 2015

принять 'A'to'Z' как 26радикс.Пример (C ++)

    vector<string> generateSequenceBySize(int N)
    {
        if(N<1)
            return vector<string>();
        int base = 26;
        vector<string> seqs;
        for(int i=0;i<pow(base,N);i++)
        {
            int value = i;
            string tmp(N,'A');
            for (int j=0;j<N;j++)
            {
                tmp[N-1-j] = 'A'+value%base;
                value = value/base;
            }
            seqs.push_back(tmp);
        }
        return seqs;
    }
    vector<string> generateSequence()
    {
        ///4554296/generatsiya-bukvennoi-posledovatelnosti-v-java
        //A, B, C, ..., Z, AA, AB, AC, ..., ZZ.
        vector<string> seqs;
        for (int i=1;i<=2;i++)
        {
            vector<string> subSeq = generateSequenceBySize(i);
            seqs.insert(seqs.end(),subSeq.begin(),subSeq.end());
        }
        return seqs;
    }
0 голосов
/ 10 сентября 2015

Просто потому, что мне нравится короткий код… вдохновленный ответом Томаса Юнга :

static String asLetters(long value) {
    int codePoint = (int) ('A' + --value % 26);
    long higher = value / 26;
    String letter = new String(Character.toChars(codePoint));
    return higher == 0 ? letter : asLetters(higher).concat(letter);
}

Начинается с 1 → a до Long.MAX_VALUECRPXNLSKVLJFHG. Используйте 'a' вместо 'A' для строчных букв.

0 голосов
/ 02 октября 2014

Это создаст последовательность для переданного значения.

/**
 * Method that returns batch names based on passed value
 * @param batchCount
 * @return String[]
 */
public static String[] getBatchNamesForExecutor(int batchCount) {
    // Batch names array
    String[] batchNames = new String[batchCount];

    // Loop from 0 to batchCount required
    for(int index=0; index < batchCount; index++) {
        // Alphabet for current batch name 
        int alphabet = index%26;

        // iteration count happened on all alphabets till now
        int iterations = index/26;

        // initializing array element to blank string
        batchNames[index] = "";

        // Looping over the iterationIndex and creating batch alphabet prefix / prefixes
        for(int iterationIndex = 0; iterationIndex < iterations; iterationIndex+=26){
            batchNames[index] += String.valueOf((char)('A' + (iterations-1) % 26 ));
        }

        // Adding last alphabet in batch name
        batchNames[index] += String.valueOf((char)('A' + alphabet % 26 ));
    }

    return batchNames;
}

public static void main(String[] args) {
    for(String s: getBatchNamesForExecutor(8))  {
        System.err.println(s);
    }
    System.exit(0); 
}
0 голосов
/ 22 августа 2012

Почему бы не создать последовательность рекурсивно?

Пример (не проверено):

public String createSequenceElement(int index) {
String sequenceElement = "";
int first  = index / 26;
int second = index % 26;
if (first < 1) {
    sequenceElement +=  (char) ('A' + second);
} else {
    sequenceElement +=  createSequenceElement(first) + (char) ('A' + second);
}
return sequenceElement ;
}

public static void main(String[] args) {
    String sequence = "";
    for (int i = 0; i < 100; i++) {
        if (i > 0) {
            sequence += ", ";
        }
        sequence += createSequenceElement(i);

    }
    System.out.println(sequence);
}
...