有人可以善良并帮助我。提前谢谢......
下面的代码将字符串输出为重复项。我不想使用Sets或ArrayList。我正在使用java.util.Random。我正在尝试编写一个代码来检查字符串是否已经被随机输出,如果是,那么它将不会显示。哪里出错了,我该如何解决这个问题。
public class Worldcountries
{
private static Random nums = new Random();
private static String[] countries =
{
"America", "Candada", "Chile", "Argentina"
};
public static int Dice()
{
return (generator.nums.nextInt(6) + 1);
}
public String randomCounties()
{
String aTemp = " ";
int numOfTimes = Dice();
int dup = 0;
for(int i=0 ; i<numOfTimes; i++)
{
// I think it's in the if statement where I am going wrong.
if (!countries[i].equals(countries[i]))
{
i = i + 1;
}
else
{
dup--;
}
// and maybe here
aTemp = aTemp + countries[nums.nextInt(countries.length)];
aTemp = aTemp + ",";
}
return aTemp;
}
}
所以我得到(随机)的输出是“美国,美国,智利”应该是“美国,智利”。
答案 0 :(得分:6)
您认为这是假的吗?
countries[i].equals(countries[i])
修改强>
这是一个骨架解决方案。我将为你填写辅助方法。
public String[] countries;
public boolean contains(String[] arr, String value) {
//return true if value is already in arr, false otherwise
}
public String chooseRandomCountry() {
//chooses a random country from countries
}
//...
int diceRoll = rollDice();
String[] selection = new String[diceRoll];
for ( int i = 0; i < selection.length; i++ ) {
while (true) {
String randomCountry = chooseRandomCountry();
if ( !contains(selection, randomCountry ) {
selection[i] = randomCountry;
break;
}
}
}
//...then build the string here
这不会检查重要内容,例如唯一countries
的数量。
答案 1 :(得分:1)
您需要一个数据结构,允许您回答“它是否已包含项目X?”的问题。
例如,尝试collection API。在您的情况下,一个好的候选人是HashSet()
或LinkedHashSet()
(后者保留了插入顺序)。
答案 2 :(得分:0)
考虑一下你将它与之比较:
if (!countries[i].equals(countries[i]))
您要将c[i]
与c[i]
进行比较吗?还是c[i]
到c[i-1]
?或者你需要检查整个数组的特定字符串?也许您需要一个获得输出的国家列表。
make list uniqueCountries
for each string called country in countries
if country is not in uniqueCountries
add country to uniqueCountries
print each country in uniqueCountries
执行此操作时,请注意索引越界,并相应调整
答案 3 :(得分:0)
使用HashSets和其他令人毛骨悚然的东西要快得多。也减少了代码:
public String randomCounties() {
List<String> results = Arrays.asList(countries);
Collections.shuffle(results);
int numOfTimes = Dice();
String result = " ";
for(int i=0 ; i<numOfTimes; i++) {
result = result + countries[i] + ", ";
}
return result;
}
答案 4 :(得分:0)
使用另一种保存已打印字符串的结构可能会更好。由于您不想使用集合,因此可以使用数组。像
这样的东西/*
...
*/
bool[] printed = new bool[countries.length];
for(int i=0 ; i<numOfTimes ; /*noop*/ )
{
int r = nums.nextInt(countries.length);
if (printed[r] == false)
{
i = i + 1;
printed[r] = true;
aTemp = aTemp + countries[r];
aTemp = aTemp + ",";
}
}
return aTemp;
答案 5 :(得分:0)
如果您想避免输出重复值,则需要记录已列出的值,或者在选择它们时从可能性池中删除值。
你提到你不想使用Sets或ArrayList(我假设你的意思是一般的Lists),我认为这是作业的要求。如果是这样,您可以通过构建数组并在它们之间以与ArrayList相同的方式复制数据来实现此目的。
一个注释,您当前的实现选择1到6个条目和4个条目的数组。如果强制选择是唯一的,则需要在没有更多唯一选择时决定如何处理这种情况。