获取重复的数组输出 - java

时间:2010-06-16 15:04:27

标签: java

有人可以善良并帮助我。提前谢谢......

下面的代码将字符串输出为重复项。我不想使用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;
    }
}

所以我得到(随机)的输出是“美国,美国,智利”应该是“美国,智利”。

6 个答案:

答案 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个条目的数组。如果强制选择是唯一的,则需要在没有更多唯一选择时决定如何处理这种情况。