随机字符串的集合,以及每个带有随机字符的字符串(java)

时间:2018-12-02 00:30:45

标签: java string random

我需要编写一个生成随机字符串集合的方法,每个字符串都是包含6至15个字符的字符串。集合中的字符串数作为参数传递给方法。 我认为字符串应具有不同的字符。

我尝试过,但是有些错误。该集合给出相同的字符串数和每个字符串中的字符数。并且字符串中的字符数与字符数一致。例如,我将int len更改为5,然后在集合中收到5个字符串,在字符串中收到5个字符。

public static void main(String[] args) {

    System.out.println(generateRandomString(5, 5));
}

public static String generateRandomString(int len, int count) {
    String letters = new String("abcdefghijklmnopqrstuvwxyz");
    StringBuffer word = new StringBuffer();
    List<StringBuffer> randomWords = new LinkedList<StringBuffer>();

    int randomIndex = 0;
    for (int i = 0; i < len; i++) {
        randomIndex = new Random().nextInt(letters.length());
        word.append(letters.charAt(randomIndex));
        for (int j = 0; j < randomWords.size() && j <= count; j++);
        randomWords.add(word);
    }
    return randomWords.toString();
}

在控制台中:

[kdvjw, kdvjw, kdvjw, kdvjw, kdvjw]

3 个答案:

答案 0 :(得分:2)

此刻,您一次又一次地向word添加对List的相同引用。这样可以使您最终得到对同一对象的List引用。

for循环的结尾处还有一个分号,并且循环有些混乱。现在,您将在外循环的每次迭代中将word添加到List的每个索引中。而是循环要返回的Strings,然后在内部循环中附加到StringBuffer

我也建议将您的Random对象放在循环之外,以免在每次迭代时都创建一个新对象:

public static String generateRandomString(int len, int count) {
    String letters = "abcdefghijklmnopqrstuvwxyz";    
    Random rand = new Random();
    List<StringBuffer> randomWords = new LinkedList<StringBuffer>();
    int randomIndex = 0;
    for (int i = 0; i < count; i++) {

        StringBuffer word = new StringBuffer();
        for (int j = 0; j <= len; j++) {
            randomIndex = rand.nextInt(letters.length());
            word.append(letters.charAt(randomIndex));
        }
        randomWords.add(word);
    }
    return randomWords.toString();
}

示例输出:

[oumcmb, vuovbx, sdysoo, aqxbxc, oijmmh]

还要注意,Apache Commons有一个RandomStringUtils类,该类具有一种生成给定长度的随机String的方法。

答案 1 :(得分:0)

我认为最好将此逻辑封装到单独的类中。

public final class RandomString {

    private static final char[] SYMBOLS = "abcdefghijklmnopqrstuvwxyz".toCharArray();

    private final Random random = new Random();

    public String nextString(int len) {
        StringBuilder buf = new StringBuilder(len);

        for (int i = 0; i < len; i++)
            buf.append(SYMBOLS[random.nextInt(SYMBOLS.length)]);

        return buf.toString();
    }
}

在需要的地方使用它:

public static Set<String> generateRandomString(int len, int count) {
    RandomString randomString = new RandomString();

    Set<String> res = new HashSet<>();

    for (int i = 0; i < count; i++)
        res.add(randomString.nextString(len));

    return res;
}

答案 2 :(得分:0)

以下是一种解决方案,该解决方案将返回在给定限制之间变化的不同长度的随机字符串的集合:

private static final String letters = "abcdefghijklmnopqrstuvwxyz";

public static String generateRandomString(int lower, int upper, int count) {
    final List<StringBuilder> randomWords = new ArrayList<>(count);
    final Random random = new Random();
    final int range = upper - lower + 1;

    while (--count >= 0) {
        int wordLength = lower + random.nextInt(range);
        final StringBuilder word = new StringBuilder(wordLength);

        while (--wordLength >= 0) {
            word.append(letters.charAt(random.nextInt(letters.length())));
        }
        randomWords.add(word);
    }
    return randomWords.toString();
}