2012-09-04 54 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