web-dev-qa-db-ja.com

Java:ランダムに異なる名前を生成します

Javaで10,000個の一意の識別子を生成する必要があります。識別子は数字と文字の混合で、それぞれ10文字未満である必要があります。何か案は?ビルトインライブラリは追加のプラスになります。

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

私は非常に遅く答えていますが、これは新しい読者にとって本当に役立つものです。これは、ランダムな有効な名前を取得するための非常にシンプルで効率的な方法です。そのためには、POM.xmlにmavenリポジトリを追加します

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

そして、あなたのJavaコードで以下のようにFakerクラスを使用します

_Faker faker = new Faker();

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

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

標準のSystem.out.println();を使用して結果を印刷してみてください

詳細については Faker Lib

31
Gaurav Lad

Java.util.UUIDを使用しないのはなぜですか?一意の識別子が生成されることが保証されており、標準と同じように取得されます:-)。

8
Rami C

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

あなたは現在の時間のmd5ハッシュを取ることを試みることができ、数字と文字の混合として「ランダムな」識別子を取得します

1

最も簡単で最速の方法は、特定の文字列の 順列 を生成することです。文字列が十分に長い限り、10,000の一意の順列を簡単に持つことができます。順列を生成する良い点は、重複を心配する必要がないことです。文字列にすべての異なる文字が含まれている場合、n!順列(nは文字列の長さ)。したがって、8つの異なる文字を含む文字列は、40,320の異なる順列を生成できます。

このような http://introcs.cs.princeton.edu/23recursion/Permutations.Java.html のように、文字列の順列を生成するコードはオンラインで多数あります。

よりランダムにしたい場合は、「abcde123」、「efgh456」など、さまざまな文字列をシードとして使用できます。

1
evergreen

あなたは試すことができます

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

長い定数は、10桁の36を底とする数値に十分です。

1
Peter Lawrey

同じ問題がありましたが、任意の長い文字列が必要でした。私はこの1ライナーを思いつきました、あなたに10文字を与える外部ライブラリは必要ありません:

BigInteger.probablePrime(50, new Random()).toString(Character.MAX_RADIX)

長さは変更できます。1文字あたり約5ビットが必要です。次のようにフィルタリングして長さを制限します(小文字とサイズ10のみ)。

BigInteger.probablePrime(100, new Random()).
    toString(Character.MAX_RADIX).
    replaceAll("[0-9]", "").
    substring(0, 10) 

欠点:少し遅いです。

1
Thomas Mueller