2017-09-11 64 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的临时分配。可以将字典映射到按字长排序的数组中,并使用具有给定长度的第一个字的索引。 –

相关问题