как генерировать увеличивающиеся алфавитно-цифровые символы, имеющие 1-ю строку, должны быть числовыми, однако последовательность из остальных букв-строк длиной 6 - PullRequest
0 голосов
/ 23 января 2019

Я хочу сгенерировать алфавитно-цифровую возрастающую последовательность, где 1-е строковое значение должно быть числовым, т. Е. (2,3,4,5,6,7,8,9), а следующие пять строк могут быть буквенно-цифровыми, т. Е. (b,c,d,g,h,j,l,m,n,p,q,r,s,t,v,w,z,2,3,4,5,6,7,8,9).

Последовательность должна начинаться с 1, и она должнагенерировать максимально возможные комбинации.Вот пример: 2bbbbc, 2bbbbd, ..., 2bbbbz, 2bbbb1, ..., 2bbbb9, 2bbbcb, 2bbbcc, ... как только будут достигнуты все комбинации, начинающиеся с 2, 1-е строковое значение будет начинаться с 3.

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

package com.test;

import java.util.LinkedList;

public class SequenceGenerate {

public static void main(String[] args) {

    //we can change the starting number 
    System.out.println("values " + buildListOfSequencesNewformate(1));

}

public static final long MAXIMUM_NUMERIC = 78125000;

public static final String ALPHA_NUMERIC = "bcdghjlmnpqrstvwz23456789";
public static final String NUMERIC = "23456789";


private static LinkedList<String> buildListOfSequencesNewformate(int i)
     {
LinkedList<String> lListOfSequences = new LinkedList<>();
long iSequenceDetails =32800;  // we can change this value 
while (i <= iSequenceDetails) {
    lListOfSequences.add(convertFromNumberToSequnece(i));
    i++;
}
return lListOfSequences;
}

private static String convertFromNumberToSequnece(long iOriginalSequence) {

    // Determine the number in base 8 value in order to extract the last two
    // digits of the Number
    String lStringOriginalSequenceBase8 = Long.toString(iOriginalSequence, 8);
    String lPaddedOriginalSequenceBase8 = padLeft(lStringOriginalSequenceBase8, 6, "0");

    //the first one digit
    String lFirstOneDigits = lPaddedOriginalSequenceBase8.substring(0, lPaddedOriginalSequenceBase8.length() - 5);

    //Extract the first 5 digits of the  Number
    // (in base8)
    String lFirstFiveDigitsBase8 = lPaddedOriginalSequenceBase8.substring(lPaddedOriginalSequenceBase8.length() - 5,
            lPaddedOriginalSequenceBase8.length());

    // convert the first five digits from base8 to base10
    long lFirstFiveDigitsBase10 = Long.parseLong(lFirstFiveDigitsBase8, 8);

    //Convert the first five digits from base10
    // to base25
    String lFirstFiveDigits = Long.toString(lFirstFiveDigitsBase10, 25);

    //Pad with zeros if required
    lFirstFiveDigits = padLeft(lFirstFiveDigits, 5, "0");

    char[] lB1UserID = new char[6];
    // Find the value of each character located at the position designated
    // by the value.
    lB1UserID[0] = NUMERIC.charAt(Integer.parseInt(lFirstOneDigits.substring(0, 1), 8));
    lB1UserID[1] = ALPHA_NUMERIC.charAt(Integer.parseInt(lFirstFiveDigits.substring(0, 1), 25));
    lB1UserID[2] = ALPHA_NUMERIC.charAt(Integer.parseInt(lFirstFiveDigits.substring(1, 2), 25));
    lB1UserID[3] = ALPHA_NUMERIC.charAt(Integer.parseInt(lFirstFiveDigits.substring(2, 3), 25));
    lB1UserID[4] = ALPHA_NUMERIC.charAt(Integer.parseInt(lFirstFiveDigits.substring(3, 4), 25));
    lB1UserID[5] = ALPHA_NUMERIC.charAt(Integer.parseInt(lFirstFiveDigits.substring(4, 5), 25));

    return new String(lB1UserID);
}

private static String padLeft(String anInputString, int iNbDigitToPad, String aStringToPad) {
    StringBuffer lStrRepresentation = new StringBuffer(anInputString);
    while (lStrRepresentation.length() < iNbDigitToPad) {
        lStrRepresentation.insert(0, aStringToPad);
    }

    return lStrRepresentation.toString();
}

}

Этот алгоритм работает нормально до значения current_sequence 32767, но проблема начинается с 32768.Для текущей последовательности 32767 сгенерировано 2bddq2, что хорошо, но для следующей последовательности, то есть 32768, она генерирует 3bbbbb’, which is incorrect. It should be 2bddq3`.

Любая помощь для решения проблемы будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Вы можете просто увидеть свое преобразование как преобразование в другую базу (с ведущими нулями, чтобы получить всегда 6 цифр), где цифры сопоставляются с нужными символами. Первая цифра имеет другую базу, а также другие символы для сопоставления.

Итак, вот что я предлагаю:

private static final char[] first = { '2', '3', '4', '5', '6', '7', '8', '9' };

private static final char[] notFrist = { 'b', 'c', 'd', 'g', 'h', 'j', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v',
        'w', 'z', '2', '3', '4', '5', '6', '7', '8', '9' };

public static void main(final String[] args) throws InterruptedException {
    final char[] result = new char[6];
    int val = 32767;
    while (true) {
        int remainder = val;

        // calculate the last 5 digits and map them to the desired characters
        for (int i = 5; 0 < i; i--) {
            result[i] = notFrist[remainder % notFrist.length];
            remainder /= notFrist.length;
        }
        if (first.length <= remainder) {
            throw new RuntimeException("We cannot convert values >=" + val);
        }

        // calculate the first (=left most) digit and map them to the desired characters
        result[0] = first[remainder];

        System.out.println(new String(result));
        val++;
    }
0 голосов
/ 23 января 2019

Хм, почему бы не что-то вроде:

 public void createSequence() {
    final String ALPHA = "bcdghjlmnpqrstvwz23456789";
    final String NUMBER = "23456789";
    ArrayList<String> combinations = new ArrayList<>();
    for (int l1 = 0; l1 < NUMBER.length(); l1++) {
        StringBuilder sequence = new StringBuilder();
        sequence.append(NUMBER.charAt(l1));
        for (int i = 0; i < 5; i++) {
            for (int l2 = 0; l2 < ALPHA.length(); l2++) {
                sequence.append(ALPHA.charAt(l2));
            }
        }
        combinations.add(sequence.toString());
    }
}

Это только помещает полные последовательности в список.

ИЛИ вы можете получить из индекса в строку:

int number = index+offset;
int digit5 = number%ALPHA.length();
int digit4 = (number-digit5)/ALPHA.length()%ALPHA.length();
...

смещение необходимо, так как в противном случае оно будет содержать строки типа ("b" или "1") и должно быть что-то вроде: Math.pow (ALPHA.length (), 5);

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

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