javastringloopsstringbuilder

How to create an array of random security codes in Java?


I am trying to write a program that would ask the user how many security codes he wants to generate, then it would output as many codes as he requested in an array.

The security code should be 7 characters long and have the following format: NNNNLLL, where N is a random number and L is a random upper case letter.

The method should create security codes with the above format by randomly selecting the characters, i.e. numbers and letters.

I am expecting the program to output something like this if a user selects to generate 4 codes:

“2394QAB” “2821TSZ” “7173AAY” “2236WQA”

I can only use the methods for this code learned in my course and I cannot use other libraries like regex, that is why I am trying it like this.

This is the code I have done so far:

import java.util.Random;
public class ItemChecker{

    private StringBuffer strBuff;
    private String[] codes;
    private String CodeLetters, CodeNumbers;
    private int[] RandomNums;

    public ItemChecker(){
            strBuff=new StringBuffer();
    }

    public String[] getCodes(int[] amount){
        codes=new String[amount.length];
        for(int i=0;i<amount.length;i++)
            {
            CodeLetters="";
            strBuff=new StringBuffer();
                for(int j=0;j<4;j++)
                    {
                        Random RandomNumber=new Random();
                        int randomIndex=RandomNumber.nextInt(RandomNums.length);

                        CodeNumbers.append(RandomNumber[randomIndex]);
                    }
                for(int j=0;j<3;j++)
                    {
                        Random RandomLetter=new Random();
                        char c =(char)(RandomLetter.nextInt(26)+'a');
                        CodeLetters+=c;
                    }
            codes[i]=CodeNumbers+CodeLetters;
        }
    }


}

My intention is to create 4 random digits and 3 random letters and add them together in a string to make the code. However, the code doesn't generate the random codes and I have no clue how to proceed from here.


Solution

  • Within your getCodes method there are a couple of mistakes. A StringBuiler would be more appropriate for this task, instead of using a StringBuffer or chaining strings with the + operator. As a matter of fact, each time you're performing a concatenation with the + operator you're creating a new string in memory, rather than working on a same instance, this is not that efficient. Also, when you're adding an offset to the random value representing an upper case letter, you're adding the lower case 'a', instead of the upper case 'A'.

    In your program, you could define a static method to offer the code generation service as a general utility and then invoke it within your getCodes method.

    In the utility method, you could declare a Random object to get random int values. Then, with a first for loop, you could generate random values between 0 included and 10 excluded, and append them to a StringBuilder object. The String class represents immutable objects, so you need to use a StringBuilder to build one. As said above, chaining strings with the + operator will create new instances at each concatenation, you're not working on the same object.

    Then, with a second for loop you could generate random values from 0 to 27 excluded, add to every value the offset 65, representing the upper case 'A' letter (lower case 'a' has value 97), and then cast this int value to a char to get its character representation. Finally, append the char to your StringBuilder instance.

    Here is an implementation:

    public class Main {
        public static void main(String[] args) {
            System.out.println(getSecurityCode());
        }
    
        public String[] getCodes(int[] amount) {
            String[] codes = new String[amount.length];
            for (int i = 0; i < codes.length; i++) {
                codes[i] = getSecurityCode();
            }
            return codes;
        }
    
        public static String getSecurityCode() {
            Random rand = new Random();
            StringBuilder strBuilder = new StringBuilder();
    
            //Appending 4 random digits
            for (int i = 0; i < 4; i++) {
                //nextInt(10) returns a value between 0 (included) and 10 (excluded)
                strBuilder.append(rand.nextInt(10));
            }
    
            //Appending 3 random upper case letters
            for (int i = 0; i < 3; i++) {
                //rand.nextInt(26) returns a random value between 0 and 25 included to represent an alphabet letter.
                //This value is added with the offset 65 which represents the upper case A letter.
                //Finally, this value is cast as a char or else it would append its int value
                strBuilder.append((char)(65 + rand.nextInt(26)));
            }
    
            return strBuilder.toString();
        }
    }