2012-09-04 85 views
0

所以我有一個二維數組與飲料的名稱,價格測試[名] [參考價格]:從二維數組中選擇隨機字符串?

public static final String[][] Test = {{"vodka1","5.0"},{"vodka2","10.0"},{"vodka3","15.0"},{"vodka4","20.0"},{"vodka5","25.0"}}; 

什麼即時試圖做的是讓用戶輸入他們的最大擁有它價格,然後從二維數組中隨機選擇一個低於其最大價格的飲料。

因此,首先我要如何縮小陣列,使其低於用戶最高價格?

這就是我想(我知道它錯了,但它的一切我能想到的):

private static final String[] test1 = {}; 
    test1 = (array_city.Test[i][j] <= Price); 
        randomIndex = random.nextInt(test1.length); 
        text2.setText(test1[randomIndex]); 

謝謝!

編輯

我已按價格排序我的陣列到最小到最大,爲了找到最大的飲料可以購買,挑選somehwere之間的隨機指標試圖此代碼,然後的setText到字符串,但當活動頁面啓動時崩潰? 這是我的代碼:

convert = Double.valueOf(array_city.Test[c][1]); 
        // Set vodka brand 
        while(Price <= convert){ 
         c++; 
         convert = Double.valueOf(array_city.Test[c][1]); 
        } 
        final TextView text2 = (TextView) findViewById(R.id.display2); 
        randomIndex = random.nextInt(c); 
        text2.setText(array_city.Test[randomIndex][1]); 

爲什麼這不起作用?

FINAL EDIT

想通了!原來是一些小的邏輯問題,改爲四個循環,它的工作原理非常棒!這裏是我做我的代碼:

convert = Double.valueOf(array_city.Test[c][1]); 
        // Set vodka brand 
        for(double i = Price; i >= convert;){ 
         c++; 
         convert = Double.valueOf(array_city.Test[c][1]); 
        } 
        final TextView text2 = (TextView) findViewById(R.id.display2); 
        randomIndex = random.nextInt(c); 
+0

這是數組按價格排序的先決條件嗎? – eboix

+0

@eboix我想我很困惑你到底在問什麼? – Hockeyman271

+1

他問是否價格總是按照從最小到最大'[1,2,3,4,5]'等數組的順序排列,而不是'[3,5,2,1,4]'。 。如果數組總是被排序,那麼你可以忽略該數組上/下的部分。 –

回答

2

首先,而不是使其成爲一個String[][]數組,你應該讓一個Drink[]陣列(其中Drink是你定義一個類,其中有一個String名稱和一個float價格。這將幫助您使用該信息,因爲您不必經常擔心將字符串解析爲雙倍價格。

如果數組按價格排序,這裏是一個僞代碼解決方案(從最低到最高):

  1. 首先找到您仍然可以購買的最昂貴的飲料。你可以進行二分法搜索,但更簡單的解決方案是從索引0到Test.length-1,檢查飲料是否可購買。如果不是,您將停止並存儲最後一次可購買飲料的索引。如果它是可購買的,你會繼續。
  2. 然後,您將生成一個從0到maxIndex(含)的隨機int,並輸出飲料。

例如,

(int)(Math.random()*(maxIndex+1))都可以獲得隨機整數。

編輯

由於數組不一定排序,你可以對它進行排序。爲此,請使用java.util.Arrays.sort(Object[] o, Comparator c)對其進行排序。

輸入您的Drink[]作爲第一個參數。而你的第二個是DrinkComparator。這會給你quicksort

假設你Drink類的定義如下:

public class Drink { 

     String name; 
     double price; // You could also use floats 

     public Drink(String n, double p) { 

      price = p; 
      name = n; 
     } 
    } 

你可以讓你DrinkComparator類這樣。

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Comparator.html

class DrinkComparator implements Comparator { 

     public int compare(Object o1, Object o2) { 
      if(o1.price < o2.price) { 
       return 1; 
      } 
      else if(o1.price == o2.price) { // Disregarding float imprecision 
       return 0; 
      } 
      else { // Not necessary, but here for the sake of readability. 
       return -1; 
      } 
     } 

     public boolean equals(Object o) { // I don't think you will be using this method. 
      return true; // If you run into problems, tell me. 
     } 
    } 
} 

那麼你會排序是這樣的:

Arrays.sort(drinks, new DrinkComparator());

drinks將是你的,當然Drink[]

+0

看看我的編輯到我的主要帖子,我已經嘗試過你的建議,但它現在崩潰? – Hockeyman271

+0

@ Hockeyman271崩潰時是否顯示錯誤信息?你能給我所有的代碼嗎? – eboix

+0

我通過它工作,它現在完美的作品!再次感謝! – Hockeyman271