匹配随机选择的2个字符串如果它们不超过12个字符的限制?
我有字符串的数组:匹配随机选择的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());
我不知道这是否代码完全将工作,因为我打字它在这里,但我知道我可以做到这一点类似。我的问题是,是否有更高效的方法来实现这一目标?
我会做这样:
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
,但你当然可以处理它。
谢谢,我真的很喜欢这种方式。下面是如何处理的异常: \t \t尝试{ \t \t \t结果= FIRST_NAME + first.get(); \t \t} catch(NoSuchElementException e){ \t \t \t result = first_name; \t \t} – David
我会做的是:
- 创建一个字典,其中的关键是长度和值是单词的数组长度相同
- 选择列表中的一个随机数密钥和得到的值(也称为第一长度)
- 选择包含值从阵列的随机数
- 选择的随机数,其中的最大长度= 12 - 第一长度
- 选择新单词(,比如s TEP 3)
- 利润
这种方法会不会使用更多的内存?当你想要使用更多的名字时,它当然会更有效率,但只有少量这样的名字?不知道虽然如此纠正我,如果我在这里错了^^ –
是的。最小的加法是数组与简单数组的关系。至少还有步骤2,4的临时分配。可以将字典映射到按字长排序的数组中,并使用具有给定长度的第一个字的索引。 –
使用一些while循环,也许 –
恕我直言,这是不是真的随机的意义上,你会得到相同的第二个名字为第一个随机获得。 –
就存储效率而言,您的解决方案可能是最好的。我真的没有办法让这个好多了。当然,可能有一些小技巧可以稍微改进,但最有可能不值得你花费在这个上的时间。 –