web-dev-qa-db-fra.com

Java: générer au hasard des noms distincts

J'ai besoin de générer 10 000 identifiants uniques en Java. Les identifiants doivent être un mélange de chiffres et de lettres et moins de 10 caractères chacun. Des idées? Les bibliothèques intégrées seraient un plus plus.

14
well actually
// class variable
final String Lexicon = "ABCDEFGHIJKLMNOPQRSTUVWXYZ12345674890";

final Java.util.Random Rand = new Java.util.Random();

// consider using a Map<String,Boolean> to say whether the identifier is being used or not 
final Set<String> identifiers = new HashSet<String>();

public String randomIdentifier() {
    StringBuilder builder = new StringBuilder();
    while(builder.toString().length() == 0) {
        int length = Rand.nextInt(5)+5;
        for(int i = 0; i < length; i++) {
            builder.append(Lexicon.charAt(Rand.nextInt(Lexicon.length())));
        }
        if(identifiers.contains(builder.toString())) {
            builder = new StringBuilder();
        }
    }
    return builder.toString();
}
17
corsiKa

Je réponds aussi tard, mais c'est ce qui est vraiment utile pour le nouveau lecteur. C'est un moyen très simple et efficace d'obtenir noms valides aléatoires. Pour ce faire, ajoutez un référentiel Maven à Pom.xml

<dependency>
    <groupId>com.github.javafaker</groupId>
    <artifactId>javafaker</artifactId>
    <version>0.12</version>
</dependency>

Puis utilisez la classe Faker comme ci-dessous dans votre Java code

Faker faker = new Faker();

String name = faker.name().fullName();
String firstName = faker.name().firstName();
String lastName = faker.name().lastName();

String streetAddress = faker.address().streetAddress();

Essayez d'imprimer le résultat à l'aide de Standard System.out.println();

Pour plus de référence Faker Lib

31
Gaurav Lad

Pourquoi ne pas utiliser java.util.uuid? Il est garanti de générer des identifiants uniques et il est aussi standard que possible :-).

8
Rami C

Si vous permettez à Apache Commons Lang ...

public String[] getRandomlyNames(final int characterLength, final int generateSize) {
    HashSet<String> list = new HashSet<String>();
    for (int i = 0; i < generateSize; ++i) {
        String name = null;
        do {
            name = org.Apache.commons.lang.RandomStringUtils.randomAlphanumeric(
                    org.Apache.commons.lang.math.RandomUtils.nextInt(characterLength - 1) + 1);
        while(list.contains(name));
        list.add(name);
    }
    return list.toArray(new String[]{});
}
2
Bladean Mericle

Vous pouvez essayer de prendre le hachage de MD5 de l'heure actuelle et vous obtiendrez un identifiant "aléatoire" comme mélange de chiffres et de lettres

1
Sergey Vedernikov

Le moyen le plus facile et le plus rapide est de générer permutations d'une certaine chaîne. Tant que la chaîne est suffisamment longue, vous pouvez facilement avoir 10 000 permutations uniques. La bonne chose de générer la permutation est que vous n'avez pas à vous soucier des doubles emplois. Si une chaîne contient tous les caractères différents, il peut générer n! permutations (n ​​est la longueur de la chaîne). Donc, une chaîne de 8 caractères différents peut générer 40 320 permutations différentes.

Il existe de nombreux codes en ligne pour générer des permutations d'une chaîne, telles que celle-ci http://introcs.cs.princeton.edu/23recursion/permutations.java.html .

Si vous voulez qu'ils soient plus aléatoires, vous pouvez utiliser différentes chaînes comme la graine, telles que "ABCDE123", "EFGH456", etc.

1
evergreen

Tu pourrais essayer

Random Rand = new Random();
Set<String> words = new HashSet<String>();
while(words.size() < 10000) 
    words.add(Long.toString(Math.abs(Rand.nextLong() % 3656158440062976L), 36)));

La longue constante est juste assez pour 10 chiffres, base 36.

1
Peter Lawrey