Я хочу сгенерировать алфавитно-цифровую возрастающую последовательность, где 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`.
Любая помощь для решения проблемы будет принята с благодарностью.