2017-09-11 3 views
2

私は文字列の配列を持っている:ランダムに選択された2つの文字列を一致させる場合は、12文字を超えないようにしてください。

String[] possible_names = { "dog", "cat", "man", "woman", "boy", "girl", "table", "chair", "computer", "fat", "phone" }; 

私は例えば、配列から2つの文字列を選択し、それらを組み合わせることにより、文字の名前を生成したい:

Random rn = new Random(); 
String first_name = possible_names[rn.nextInt(possible_names.length - 1)]; 
String last_name = possible_names[rn.nextInt(possible_names.length - 1)]; 
String full_name = first_name + last_name; 

問題があり、フルネームが12文字を超える場合、またはfirst_name == last_nameの場合、フルネームを生成することはできません。

文字が12を超えているかどうかを確認するのは簡単でしょうが、姓と名が等しいと返されますが、私はそれをしたいだけです。

は、私がこれを行う方法を考え出したが、私はそれがより効率的になりたいとメモリを消費しないよう:私は入力されたので、そのコードが正確に動作するかどう

ArrayList<String> acceptable_last_names = new ArrayList<String>(); 
Random rn = new Random(); 
String first_name = possible_names[rn.nextInt(possible_names.length - 1)]; 
for (String s : possible_names) { 
    if (s.length < (12 - first_name.length)) { 
     if (!s.equalsIgnoreCase(first_name)) { 
      acceptable_last_names.add(s); 
     } 
    } 
} 
last_name = acceptable_last_names.get(rn.nextInt(acceptable_last_names.size()); 

は、私にはわかりませんそれはここにあるが、私はそれをそれと同様にすることができることを知っている。私の質問は、これを達成するより効率的な方法があるということですか?

+1

ループを使用してください。おそらく –

+1

IMHOランダムに取得された最初のものと同じ名前を取得するという意味では、これは実際にランダムではありません。 –

+0

メモリ効率の面では、おそらくソリューションが最も良いでしょう。私は本当にこれをもっと良くする方法を見ていません。もちろん、これを少し改善するためのいくつかの小さなトリックがあるかもしれませんが、それはあなたがそれに費やす時間の価値がない可能性が最も高いでしょう。 –

答えて

0

List<String> stringList = Arrays.asList(possible_names); 

String firstName = stringList.get(new Random().nextInt(stringList.size())); 

Collections.shuffle(stringList); 
Optional<String> first = stringList.stream().filter(s -> firstName.length() + s.length() <= 12 && !s.equals(firstName)).findFirst(); 

System.out.println(firstName + first.get()); 

だから、まず、あなたの配列がListに変換します。次に、そこからランダムな要素を選択します。その後、あなたはshuffleあなたのリストをチェックし、あなたの条件に合った最初の要素を探して繰り返します。

この方法は解決策がある場合にのみ機能します。そうでないと、プログラムはにexceptionを投げますが、もちろん処理できます。

+0

ありがとう、私は本当にこのように好きです。ここで私は例外扱い方法は次のとおりです。 \t \t試し{ \t \t \t結果を= FIRST_NAME + first.get(); \t \t} catch(NoSuchElementException e){ \t \t \t result = first_name; \t \t} – David

1

私は何をしたいことは、次のようになります。

  1. は、キーの長さであり、値が同じ長さ
  2. と言葉の配列は、リストの乱数を選択している辞書を作成します第一の長さ
  3. 新語(S等を選択 - キーと値(第1長別名)
  4. 、値
  5. を含む配列から乱数を選択し得る最大長= 12で乱数を選択します私はこの方法でそれを行うだろうTEP 3)
  6. 利益
+1

そのアプローチではより多くのメモリを使用しないでしょうか?より多くの名前を使用したいときは、より効率的になるでしょうが、このような名前は少々ありますか?確かに私はここで間違っている場合は私を修正する^^ –

+0

はい。最小の追加は配列と単純な配列の関係になります。少なくとも2,4のステップのための一時的割り当てもある。代わりに単語長で配列された配列内の辞書をマップし、最初の単語のインデックスを所定の長さで使用することができます。 –

関連する問題