получение дублированного массива вывода - Java - PullRequest
0 голосов
/ 16 июня 2010

Может кто-нибудь может быть добрым и помочь мне здесь.Заранее спасибо ...

Мой код ниже выводит строку как дубликаты.Я не хочу использовать 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 ]

6 голосов
/ 16 июня 2010

Когда вы ожидаете, что это будет ложным?

countries[i].equals(countries[i])

Edit:

Вот скелетное решение. Я оставлю заполнение вспомогательных методов для вас.

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 голос
/ 16 июня 2010

Вам нужна структура данных, которая позволяет вам ответить на вопрос «она уже содержит элемент X?»

Попробуйте, например, API collection .В вашем случае хорошим кандидатом является либо HashSet(), либо LinkedHashSet() (последний сохраняет порядок вставки).

0 голосов
/ 16 июня 2010

Если вы хотите избежать вывода повторяющихся значений, вам нужно записать, какие значения уже перечислены, или удалить значения из пула возможностей, когда они выбраны.

Вы упоминаете, что не хотите использоватьSets или ArrayList (я предполагаю, что вы имеете в виду списки в целом), я предполагаю, что это требование присваивания.Если это так, вы можете сделать это, создавая массивы и копируя данные между ними так же, как это сделал бы ArrayList.

одна заметка, ваша текущая реализация выбирает от 1 до 6 записей и массив из 4 записей.Если вы заставляете выбор быть уникальным, вам нужно решить, как обрабатывать случай, когда у вас больше нет уникальных вариантов выбора.

0 голосов
/ 16 июня 2010

Возможно, вам лучше использовать другую структуру, в которой вы сохраняете напечатанные строки.Поскольку вы не хотите использовать набор, вы можете использовать вместо него массив.Что-то вроде

/* 
    ...
 */
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;
0 голосов
/ 16 июня 2010

Гораздо более быстрый способ сделать это, чем использовать 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;
}
0 голосов
/ 16 июня 2010

Рассмотрим, с чем вы сравниваете:

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

Когда вы делаете это, следите за индексом за пределами и корректируйте соответственно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...