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

Matching 2 strings chosen at random IF they don't exceed a limit of 12 characters?

我有一个字符串数组:

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 或名字和姓氏是否相等并且 return 会很容易,但我希望它只是.. 我想如果失败再试一次。

我已经想出了一个方法来做到这一点,但我希望它更有效率而不是占用内存:

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. 创建一个字典,其中键是长度,值是具有相同长度的单词数组
  2. select 键列表的随机数并获取值(又名第一个长度)
  3. select 包含值
  4. 的数组中的随机数
  5. select 一个随机数,其中最大长度 = 12 - 第一个长度
  6. select 一个新单词(如第 3 步)
  7. 利润

我会这样做:

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,但你当然可以处理它。