Выберите случайную строку из данного списка - PullRequest
2 голосов
/ 20 марта 2011

Я пытаюсь заставить Java выбрать 1 случайную строку из заданного списка.

Пример списка строк:

1153    3494    9509    2   0   0   0   0
1153    3487    9509    2   0   0   0   0
1153    3491    9525    2   0   0   0   0
1153    3464    9513    2   0   0   0   0

Каждая строка состоит из 1 строки

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

Кто-нибудь знает, как это сделать?

Ps. Я в значительной степени новичок с Java: S, поэтому я боюсь просто сказать, что я должен использовать arraylist (например) не будет работать: P

Ответы [ 3 ]

5 голосов
/ 20 марта 2011
public static void main(String[] args) throws InterruptedException {
    List<String> my_words = new LinkedList<String>();
    my_words.add("1153 3494 9509 2 0 0 0 0");
    my_words.add("1153 3487 9509 2 0 0 0 0");
    my_words.add("1153 3491 9525 2 0 0 0 0");
    my_words.add("1153 3464 9513 2 0 0 0 0");

    Random rand = new Random();
    while (true) {
        int choice = rand.nextInt(my_words.size());
        System.out.println("Choice = " + my_words.get(choice));
        Thread.sleep(1000);
        int replaceTo = rand.nextInt(my_words.size());          
        System.out.println("Replace to = " + my_words.get(replaceTo));
        my_words.set(choice, my_words.get(replaceTo));          
    }
}
1 голос
/ 20 марта 2011

Если у вас есть список / массив данных и вы хотите выбрать случайный элемент из списка.Возможно, проще всего было бы сгенерировать случайное число с помощью функции Math.random (http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Math.html), которая находится между 0 и счетчиком вашего списка / массива.

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

Просто следите за проблемами параллелизма при использовании многопоточности, прочитайте на http://download.oracle.com/javase/tutorial/essential/concurrency/.

Обновление (пример):

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

Таким образом, вы будете создавать список, затем генерировать случайное число в диапазоне списка (от 0 до размера списка в качестве максимума). И затем извлекать данные из списка.указав в списке ваш случайный индекс. Примером может быть:

List<String> my_words = new LinkedList<String>();
my_words.add("1153 3494 9509 2 0 0 0 0");
my_words.add("1153 3487 9509 2 0 0 0 0");
my_words.add("1153 3491 9525 2 0 0 0 0");
my_words.add("1153 3464 9513 2 0 0 0 0");

//Maybe a loop to load all your strings here...

Random random = new Random(); //Create random class object
int randomNumber = random.nextInt(my_words.size()); //Generate a random number (index) with the size of the list being the maximum
System.out.println(my_words.get(randomNumber)); //Print out the random word

Надеюсь, что это имеет немного больше смысла, и на секунду подумал, что класс Random в java.util.будет легче стучать головой.

0 голосов
/ 20 марта 2011

Поскольку вы говорите, что вы новичок в Java, это полный пример класса для выбора случайных элементов из списка строк:

package com.jmcejuela.lab;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;


public class SO {

    static final int SLEEP_TIME = 2 * 1000; //expressed in milliseconds

    static public void main(String[] args) throws InterruptedException {
        List<String> list = new ArrayList<String>();        
        list.add("hi");
        list.add("hello");
        list.add("booya!"); 

        Random rg = new Random();
        String randomElement;
        int listSize = list.size();
        /* No sense in randomizing when the list has 0 or 1 element
         * Indeed rg.nextInt(0) throws an Exception.
         * You should also check, maybe in a method, that the list
         * is not null before calling list.size()
         */
        if (listSize < 2)
            return;

        while(true) {
            randomElement = list.get(rg.nextInt(listSize));
            System.out.println(randomElement);
            Thread.sleep(SLEEP_TIME);
        }
    }   
}

Тогда, что вы хотите в конечном итоге достичь? С подобным кодом вы можете установить переменную класса, например. Скорее всего, вы хотите иметь отдельный поток, который запускает этот код.

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