2015-08-18 2 views
1

Я создаю игру разума, ее трудно объяснить, поэтому я приведу пример.Умное создание элементов пары в разных списках

У меня есть список слов (это может быть бесконечным):

String myList[] = {"chair", "house", "ocean", "plane", "dog", "TV", "grass", "money" etc....} 

Теперь сложная часть, мне нужно построить 4 списки пар индекс/слово (каждый список имеет тот же размер) случайным образом, но которые соответствуют этому правилу: , если я выбрал номер, слово, соответствующее этому номеру, отображается только в двух списках.

, например, это было бы правильно:

List1: 
1/chair 
2/house 
3/plane 
4/grass 

List2 
1/chair 
2/dog 
3/plane 
4/TV 

List3: 
1/ocean 
2/house 
3/money 
4/TV 

List4 
1/ocean 
2/dog 
3/money 
4/grass 

Например:

Если я выбираю номер 3, то список 3 и список 4 матча слово «деньги», список 1 и 2 Сопоставьте слово «самолет». Всегда должно быть 2 списка соответствия (не меньше и не больше). Они должны быть построены из огромного массива слов случайным образом, поэтому вы не можете угадать, какой список будет соответствовать, когда вы выберете номер.

Я попытался сделать это с помощью простого простого рекурсивного алгоритма. Но я плохо потерпел неудачу.

+1

Не могли бы вы поделиться своей попытки и причины, почему это не удалось. Это было бы более в духе этого сайта. –

+0

Массивы не могут быть бесконечными. –

+0

ok let заменить infinit огромным ... – Tyvain

ответ

0

Что-то, как это должно сделать трюк (вы можете изменить предоставленные слова и соответствующие listSize соответственно). Количество слов должно быть делящимся на listSize, чтобы заполнить все списки.

public static void main(String[] args) { 
    String[] words = new String[] { "chair", "house", "ocean", "plane", 
      "dog", "TV", "grass", "money" }; 
    // valid list sizes for 8 words: 1, 2, 4, 8 
    int listSize = 4; 
    List<String[]> result = distributeRandomly(words, listSize); 
    for (String[] resultList : result) { 
     for (int index = 0; index < listSize; index++) { 
      System.out.println((index + 1) + "/" + resultList[index]); 
     } 
     System.out.println(); 
    } 
} 

private static List<String[]> distributeRandomly(String[] words, int listSize) { 
    // each word goes into 2 lists, so how many lists do we need? 
    int listCount = words.length * 2/listSize; 
    if (listCount * listSize != words.length * 2) { 
     throw new IllegalArgumentException("Number of words" 
       + " must be a multiple of the size of the individual lists!"); 
    } 
    // initialize result lists (here arrays) in fitting size 
    List<String[]> listsToFill = new ArrayList<String[]>(listCount); 
    for (int index = 0; index < listCount; index++) { 
     listsToFill.add(new String[listSize]); 
    } 
    // be sure to randomly pick the given words by shuffling them 
    List<String> shuffledWords = new ArrayList<String>(Arrays.asList(words)); 
    Collections.shuffle(shuffledWords); 

    List<String[]> result = new ArrayList<String[]>(listCount); 
    int maxWordPosition = listSize - 1; 
    // distribute words 
    for (String word : shuffledWords) { 
     // word is supposed to be inserted in two lists at the same index 
     int wordPosition = -1; 
     // iterate result lists 
     Iterator<String[]> listIterator = listsToFill.iterator(); 
     while (listIterator.hasNext()) { 
      String[] list = listIterator.next(); 
      if (wordPosition == -1) { 
       // look out for the first list with an empty slot 
       for (int index = 0; index < listSize; index++) { 
        if (list[index] == null) { 
         // found empty slot at this index 
         wordPosition = index; 
         // insert word here (first list) 
         list[wordPosition] = word; 
         if (wordPosition == maxWordPosition) { 
          // the list is full, no more empty slots here 
          listIterator.remove(); 
          result.add(list); 
         } 
         break; 
        } 
       } 
      } else if (list[wordPosition] == null) { 
       // found second list with an empty slot at the same index 
       list[wordPosition] = word; 
       if (wordPosition == maxWordPosition) { 
        // the list is full, no more empty slots here 
        listIterator.remove(); 
        result.add(list); 
       } 
       // we are done with this word 
       break; 
      } 
     } 
     // shuffle result lists again, to ensure randomness 
     Collections.shuffle(listsToFill); 
    } 
    return result; 
} 

Это производит (например) следующий вывод:

1/grass 
2/TV 
3/plane 
4/ocean 

1/grass 
2/dog 
3/money 
4/chair 

1/house 
2/dog 
3/money 
4/ocean 

1/house 
2/TV 
3/plane 
4/chair 
1

Мой первоначальный подход к решению этой проблемы было бы

  1. Выберите случайное слово во вселенной
  2. Связать выбранное слово в двух списках,
    • различны и
    • не являются полный
  3. Храните случайное слово в наборе закрытых слова в случае, если он выбран снова
  4. полоскания и повторять, пока все списки не полные
+0

Кажется легким ... Я пробую это сегодня вечером и посмотрю, работает ли он. – Tyvain

Смежные вопросы