2011-03-20 62 views
2

我想让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。 我几乎noobie用java:S,所以我只是说我应该使用arraylist(例如)不会工作:P

+0

嗯,我试图找出ArrayList中,但我还挺失败的.. – JJx 2011-03-20 13:18:17

+0

Regardint下面的答案 - 我想你应该在你的queston更精确,也许尝试对其进行修改。写出你有什么情况:例如一个线程或多个线程? – smas 2011-03-20 13:59:02

回答

5
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));   
    } 
} 
+0

:D,'1000'是计时器?但是,当我想在编码的其他地方使用它时,它是如何定义的?那是一个循环? (想想我忽略了这个循环:P) – JJx 2011-03-20 13:49:44

+0

这是毫秒级的时间,当你的程序进入休眠状态时,它意味着会等待,你可以将它改变成任何值,甚至是常量,然后你可以在你的应用程序的其他部分使用它。我不确定你的意思是“想在别的地方使用它”? - 你想用什么:时间或这种方法? – smas 2011-03-20 13:54:24

+0

我的意思是这个随机字符串:P – JJx 2011-03-20 13:57:58

1

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

希望这样做更有意义,再次考虑java.util中的Random类。会更容易敲打你的头。

+0

我真的不明白这一点......我给我的字符串数字左右?并使math.random选择了一个随机数呢?我遇到的问题是将数字math.random恢复为原始字符串。如果你的意思是字符串是由math.random生成的。字符串本身不能由java生成。它应该只从一个给定的字符串列表中挑选一个 – JJx 2011-03-20 13:13:44

+0

顺便说一句,我包含了一个顶部列表的例子现在 – JJx 2011-03-20 13:24:16

+0

哇!谢谢!所以如果我在我的代码中实现它,它只会选择其中一个字符串? :O但是,我怎样才能使每7200秒取代之前的随机数字:S顺便说一下,当我想在我的代码中的其他地方使用它时,randomNumber是如何定义的?就像'my_words'一样? – JJx 2011-03-20 13:41:23

0

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

然后,你想要什么,最终实现?例如,使用类似的代码你可以设置一个类变量。很可能你想要一个单独的线程来运行这个代码。

+0

哇!谢谢! :O,那是否也替换了之前的字符串? :O型。顺便说一句,计时器是2 * 1000? 噢,如果我想在我的代码中的其他地方使用它,那么它是如何定义的? – JJx 2011-03-20 13:46:03

+0

这很难解释,但它的游戏私人服务器。这些字符串是产生某物的坐标:物品产生,在7200秒后消失,并在列表中的一个坐标处重新生成。 我可以把它放在一个单独的线程中:P – JJx 2011-03-20 13:52:17

+0

是的,它取代了以前的字符串。 Thread.sleep的输入以毫秒表示,所以2 * 1000表示2秒。写7200或任何你想要的。其余的你必须更具体。 – juanmirocks 2011-03-20 13:53:27

相关问题