匹配2个随机选择的字符串,如果它们不超过12个字符的限制?

时间:2017-09-11 11:53:19

标签: java random character generator limit

我有一个字符串数组:

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 个答案:

答案 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上抛出first.get(),但您当然可以处理它。