【问题标题】:Select random string from given list从给定列表中选择随机字符串
【发布时间】:2011-07-19 02:48:27
【问题描述】:

我正在尝试让 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 秒)并用列表中的另一个随机字符串(可能相同)替换前一个字符串。 循环有点无限。

有人知道怎么做吗?

附言。 我对 java 非常陌生:S,所以恐怕只是说我应该使用数组列表(例如)不会工作:P

【问题讨论】:

  • 好吧,我试图找出arraylist,但我有点失败..
  • 关于下面的答案 - 我认为你应该在你的问题中更精确,也许尝试修改它。写下你有什么情况:e.g.一个线程还是多个线程?

标签: java list random selection


【解决方案1】:
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));          
    }
}

【讨论】:

  • :D,'1000' 是计时器吗?但是当我想在我的编码中的其他地方使用它时,它是如何定义的?那是一个循环吗? (认为​​我忽略了循环:P)
  • 这是您的程序休眠的毫秒时间,这意味着将等待,您可以将其更改为任何值,甚至是常量,然后您可以在应用程序的其他部分使用它。我不确定你是什么意思“想在其他地方使用它”? - 你想用什么:时间还是这个方法?
  • 但在您的问题中是“选择一个,等待一段时间(如 7200 秒)并替换前一个” - 所以 while-loop 的第一部分将选择字符串,第二部分将替换它。一切都将保存在您的 my_words 列表中
【解决方案2】:

如果您有一个数据列表/数组,并且您想从列表中选择一个随机元素。最简单的可能是使用介于 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

希望这更有意义,然后想到 java.util 中的 Random 类。会更容易敲打你的头。

【讨论】:

  • 我不太明白...我给我的字符串一个数字左右?并让 math.random 选择一个随机数?然后我遇到的问题是将数字 math.random 选择回原始字符串。如果您的意思是字符串是由 math.random 生成的。字符串本身不能由 java 生成。它应该只从给定的字符串列表中选择一个
  • 顺便说一句,我现在在顶部添加了一个列表示例
  • 哇!谢谢!所以如果我在我的代码中实现它,它只会选择其中一个字符串? :O 但是,我怎样才能让它每 7200 秒替换一次之前的随机数 :S 顺便说一句,当我想在我的代码中的其他地方使用它时,随机数是如何定义的?就像“my_words”一样?
  • 您希望如何每 7200 秒更改一次数字取决于您,您可以创建一个单独的线程,在后台执行此操作。请参阅此处了解线程教程,javabeginner.com/learn-java/java-threads-tutorial。或者你可以在主线程中创建一个循环,但这会在主线程中停止执行。
  • 啊,好吧,我只是参考主线程中的另一个线程。啊哈,谢谢 ;)
【解决方案3】:

既然你说你是 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);
        }
    }   
}

那么,你最终想要完成什么?例如,使用类似的代码,您可以设置一个类变量。很可能您希望有一个单独的线程来运行此代码。

【讨论】:

  • 哇!谢谢! :O,那是不是也替换了它以前的字符串? :O。顺便说一句,计时器是 2 * 1000 吗?哦,当我想在代码的其他地方使用它时,它是如何定义的?
  • 这很难解释,但它适用于游戏专用服务器。字符串是生成某物的坐标:该项目生成,在 7200 秒后消失,然后在列表中的一个坐标处重新生成。我确实可以把它放在一个单独的线程中:P
  • 是的,它替换了之前的字符串。 Thread.sleep 的输入以毫秒为单位,因此 2 * 1000 表示 2 秒。写 7200 或任何你想要的。其余的你必须更具体。
  • 关于“它是如何定义的”我的意思是,当我想在另一段代码中使用这个随机数时,我要输入什么。 'My_words' 或 'random' 或 'RandomElement'。
  • randomElement 您似乎对编程完全陌生。你为什么不自己开始编码和试验呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-08
  • 1970-01-01
  • 2014-06-24
  • 2016-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多