2017-09-11 17 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

使用一些while循環,也許 –

+1

恕我直言,這是不是真的隨機的意義上,你會得到相同的第二個名字爲第一個隨機獲得。 –

+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你的列表,並遍歷它搜索匹配你的條件的第一個元素。

這種方法只有在有解決方案的情況下才會起作用,否則你的程序會在first.get()上拋出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. 選擇包含值從陣列的隨機數
  4. 選擇的隨機數,其中的最大長度= 12 - 第一長度
  5. 選擇新單詞(,比如s TEP 3)
  6. 利潤
+1

這種方法會不會使用更多的內存?當你想要使用更多的名字時,它當然會更有效率,但只有少量這樣的名字?不知道雖然如此糾正我,如果我在這裏錯了^^ –

+0

是的。最小的加法是數組與簡單數組的關係。至少還有步驟2,4的臨時分配。可以將字典映射到按字長排序的數組中,並使用具有給定長度的第一個字的索引。 –

相關問題