0

だから私が持っているのは、飲み物の名前と価格 Test[Name][Price] の 2 次元配列です。

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

私がやろうとしているのは、ユーザーが最大価格を入力すると、最大価格を下回る2次元配列から飲み物がランダムに選択されるようにすることです。

まず、ユーザーの最大価格よりも低い飲み物だけに配列を絞り込むにはどうすればよいですか?

これは私が試したものです(私はそれが間違っていることを知っていますが、私が考えることができるすべてです):

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

ありがとう!

編集

価格に応じて配列を最小から最大に並べ替え、このコードを試して、購入可能な最大の飲み物を見つけ、間のランダムインデックスを選択し、その文字列にテキストを設定しましたが、アクティビティページが開始するとクラッシュしますか? これが私のコードです:

    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]);

これが機能しないのはなぜですか?

最終編集

理解した!!いくつかのマイナーなロジックの問題であることが判明し、4 ループに変更したところ、うまく機能しました!! これが私のコードに対して行ったことです:

    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);
4

1 に答える 1

2

まず、配列にするのではなく、String[][]配列にする必要がありますDrink[](Drinkは定義したクラスで、String名前とfloat価格があります。これは、情報を使用するのに役立ちます。価格文字列を double に解析することについて常に心配する必要があります。

配列が価格順 (最低から​​最高) に並べ替えられている場合の疑似コード ソリューションを次に示します。

  1. まず、まだ買える最も高価な飲み物を見つけます。それを二分探索することもできますが、より簡単な解決策は、インデックス 0 から Test.length-1 に移動して、飲み物が購入可能かどうかを確認することです。そうでない場合は、最後の購入可能な飲み物のインデックスを停止して保存します。購入可能な場合は、続行します。
  2. int次に、 0 から(0 を含む) までの乱数を生成しmaxIndex、Drink を出力します。

例えば、

(int)(Math.random()*(maxIndex+1))ランダムな整数を取得します。

編集

配列は必ずしもソートされているとは限らないため、ソートできます。これを行うには、 を使用java.util.Arrays.sort(Object[] o, Comparator c)して並べ替えます。

Drink[]最初のパラメーターとしてyour を入力します。そして、DrinkComparatorあなたの2番目として。これ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[]です。

于 2012-09-04T20:51:34.763 に答える