(爪哇)如何创建一个循环,将我从一个数组生成的随机名称分配给多个字符串?



对Java比较陌生,我正在为一个类制作游戏的关键部分寻找解决方案。我们的想法是制作一款非常简单的股票市场模拟游戏,但问题在于如何创建虚构的公司名称。我有三个数组,分别存储公司的名、中、姓。我试着让其中一些公司有一个单词的名字,另一些有两个,等等。到目前为止,我已经使用了一个随机数生成器和if/elif/else语句来模拟一个随机数,但是我想要五个随机数,并且我更喜欢一种更有效的方法。下面是代码:

import java.util.Random;
import java.io.*;
import java.util.*;
class Main {
public static void main(String[] args) {
// The code all goes in here
String[] companyFirstNames = {"Alpine", "Bear", "Bull", "Cuckoo", "Delta", "Dragon", "Echo", "Fighter", "Giant", "H20", "Indo", "Jared", "Jason", "Kicker", "Lodge", "Little", "Manzo", "Mint", "Neighbour", "Nelson", "Ossuary", "Open", "Private", "Poor", "Quick", "Quiant", "Reach", "Rebel", "Space", "Spear", "Titus", "Trebble", "Underdog", "Upper", "Vital", "Vert", "White", "Whistle", "X's", "Yuri's", "Yogurt", "Zebra"};
String[] companySecondNames = {" Science", " Technology", " Arts", " Research", " Laboratory", " Lodging", " Woodworking", " Fashion", " Oil", " Trading", "  Investing"};
String[] companyLastNames = {" Limited", " Co.", " Corp.", " Corporation", " Ltd", " Institute", " Association", " Federation", " Firm"};
//Three arrays of random company name "pieces"
Random randomNamer = new Random();
//Used for getting random names & ints
int randomOne = randomNamer.nextInt(companyFirstNames.length);
int randomTwo = randomNamer.nextInt(companySecondNames.length);
int randomThree = randomNamer.nextInt(companyLastNames.length);
//Three ints that are given random values associated to the arrays
int numberOne = randomNamer.nextInt(100);
//Getting a random 0-100 number
String bigNameCompany = companyFirstNames[randomOne] + companySecondNames[randomTwo] + companyLastNames[randomThree]; 
String midNameCompany = companyFirstNames[randomOne] + companyLastNames[randomThree];
String smallNameCompany = companyFirstNames[randomOne];
//The three types of company names possible to produce
String companyOne;
String companyTwo;
String companyThree;
String companyFour;
String companyFive;
//The five companies I want to name
if (numberOne <= 45) {
companyOne = bigNameCompany;
//The first company name is random and big
} else if (numberOne <= 85) {
companyOne = midNameCompany;
//Two word name
} else {
companyOne = smallNameCompany;
//One word name
}
System.out.println(companyOne);
//printing the name of the first company
//Can i get a loop to do this more efficiently for 5 companies?
}
}

我建议您尝试一下。编程的乐趣就在于解决这样的小难题,有很多方法可以解决这样的问题。这里有一个给你一些想法:

Random randomNamer = new Random();
String[] companyFirstNames = { "Alpine", "Bear", "Bull", "Cuckoo", "Delta", "Dragon", "Echo", "Fighter", "Giant", "H20", "Indo", "Jared", "Jason", "Kicker", "Lodge", "Little", "Manzo", "Mint", "Neighbour", "Nelson", "Ossuary", "Open", "Private", "Poor", "Quick", "Quiant", "Reach", "Rebel", "Space", "Spear", "Titus", "Trebble", "Underdog", "Upper", "Vital", "Vert", "White", "Whistle", "X's", "Yuri's", "Yogurt", "Zebra" };
String[] companySecondNames = { " Science", " Technology", " Arts", " Research", " Laboratory", " Lodging", " Woodworking", " Fashion", " Oil", " Trading", "  Investing" };
String[] companyLastNames = { " Limited", " Co.", " Corp.", " Corporation", " Ltd", " Institute", " Association", " Federation", " Firm" };
for (int i = 0; i < 5; i++) {
int chance = randomNamer.nextInt(100);
int firstIdx = randomNamer.nextInt(companyFirstNames.length);
int secondIdx = randomNamer.nextInt(companySecondNames.length);
int lastIdx = randomNamer.nextInt(companyLastNames.length);
String name = null;
if (chance <= 45) {
name = companyFirstNames[firstIdx] + companySecondNames[secondIdx] + companyLastNames[lastIdx];
} else if (chance <= 85) {
name = companyFirstNames[firstIdx] + companyLastNames[lastIdx];
} else {
name = companyFirstNames[firstIdx];
}
System.out.println(name);
}

您可以为此创建一个简单的方法(并且您不需要在名称String中使用空白):

private final String[] companyFirstNames = {"Alpine", "Bear", "Bull", "Cuckoo", "Delta", "Dragon", "Echo", "Fighter", "Giant", "H20", "Indo", "Jared", "Jason", "Kicker", "Lodge", "Little", "Manzo", "Mint", "Neighbour", "Nelson", "Ossuary", "Open", "Private", "Poor", "Quick", "Quiant", "Reach", "Rebel", "Space", "Spear", "Titus", "Trebble", "Underdog", "Upper", "Vital", "Vert", "White", "Whistle", "X's", "Yuri's", "Yogurt", "Zebra"};
private final String[] companySecondNames = {"Science", "Technology", "Arts", "Research", "Laboratory", "Lodging", "Woodworking", "Fashion", "Oil", "Trading", "Investing"};
private final String[] companyLastNames = {"Limited", "Co.", "Corp.", "Corporation", "Ltd", "Institute", "Association", "Federation", "Firm"};
private final Random randomNamer = new Random();
private String generateRandomName() {
StringBuilder sb = new StringBuilder();

int size = random.nextInt(100);
int first = random.nextInt(companyFirstNames.length);
sb.append(companyFirstNames[first]);

if (size <= 85) {
int second = random.nextInt(companySecondNames.length);
sb.append(' ').append(companySecondNames[second]);
}
if (size <= 45) {
int last = random.nextInt(companyLastNames.length);
sb.append(' ').append(companyLastNames[last]);
}
return sb.toString();
}

那么你可以这样做:

private List<String> generateNames(int numberOfNames) {
return IntStream.range(0, numberOfNames).mapToObj(i -> 
generateRandomName()).collect(Collectors.toList());
}

调用最后一个方法将允许您创建任意多的名称:

List<String> names = generateNames(5)
System.out.println(names);

输出:

[White Trading Firm, Open Research, Indo Oil, Fighter Technology, Cuckoo Oil Corporation]

您的解决方案可能会起作用,但是您可以重用您的Random来决定公司名称应该包含一个、两个还是三个单词,以使其更紧凑。这个例子总是会生成至少有一个名称的公司,而第二个和第三个名称的概率是相等的:

final Random rnd = new Random();
final String[] companies = new String[5];
for(int i = 0; i < companies.length; i++) {
final int idx = rnd.nextInt(100);
companies[i] = companyFirstNames[idx%companyFirstNames.length] 
+ (rnd.nextBoolean() ? companySecondNames[idx%companySecondNames.length] : "")
+ (rnd.nextBoolean() ? companyLastNames[idx%companyLastNames.length] : "");
}

您可以使用rnd.nextInt(2) == 0rnd.nextInt(3) == 0之类的东西来发挥较长的公司名称而不是nextBoolean()的可能性。

编辑

值得考虑的事情是唯一性——如果你碰巧多次生成相同的公司名称会有问题吗?根据您的策略,您可以跟踪您生成的数字或名称(可能在Set中),并在它已经存在时重新生成。

最新更新