如果不超过 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());
我不知道该代码是否完全有效,因为我在此处输入了它,但我知道我可以像那样做。我的问题是,有没有更有效的方法来实现这一目标?
我会做的是:
- 创建一个字典,其中键是长度,值是具有相同长度的单词数组
- select 键列表的随机数并获取值(又名第一个长度)
- select 包含值
的数组中的随机数
- select 一个随机数,其中最大长度 = 12 - 第一个长度
- select 一个新单词(如第 3 步)
- 利润
我会这样做:
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
,但你当然可以处理它。
我有一个字符串数组:
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());
我不知道该代码是否完全有效,因为我在此处输入了它,但我知道我可以像那样做。我的问题是,有没有更有效的方法来实现这一目标?
我会做的是:
- 创建一个字典,其中键是长度,值是具有相同长度的单词数组
- select 键列表的随机数并获取值(又名第一个长度)
- select 包含值 的数组中的随机数
- select 一个随机数,其中最大长度 = 12 - 第一个长度
- select 一个新单词(如第 3 步)
- 利润
我会这样做:
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
,但你当然可以处理它。