2011-03-20 92 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

相關問題