2012-01-04 5 views
0

を取得し、私はをループする要素のリストを持って、いくつかの値を計算します。今、私のコードでは、Javaでソートされた配列の元のインデックス(アンドロイド)

 double targetRatio = Math.min((double)w/h, (double)h/w);//height & width of the screen 
     List<Size> sizes //populated with supported height and width 
    double ratioArray[]; 
    int i; 
    for (i = 0; i <= sizes.size(); i++) 
    { 
     double ratio = Math.min((double)sizes.get(i).width/sizes.get(i).height, (double)sizes.get(i).height/sizes.get(i).width); 
     ratioArray[i] = Math.abs(ratio - targetRatio); 
     // Math.min((double)sizes.get(i).width/w, (double)w/sizes.get(i).width); 
     // Math.min((double)h/sizes.get(i).height, (double)sizes.get(i).height/h); 
     //sizes.get(i).width 
     //sizes.get(i).height 

    } 

ratioArrayで低い値を[I ]私が得たよりよい比;今、私は最高の比率を見つけるで立ち往生していますが、私はこれを行うことができます:

Arrays.sort(ratioArray); 

たが、その後をどのように私は戻ってインデックスを得るのですか?私は最小値をそのサイズにする必要があります

答えて

2

最良の方法は、ratioArrayを反復処理すると、上記のコードはこれを入れた後Arrays.sort(ratioArray);

double targetRatio = Math.min((double)w/h, (double)h/w);//height & width of the screen 
     List<Size> sizes //populated with supported height and width 
    double ratioArray[]; 
    int i; 
    for (i = 0; i <= sizes.size(); i++) 
    { 
     double ratio = Math.min((double)sizes.get(i).width/sizes.get(i).height, (double)sizes.get(i).height/sizes.get(i).width); 
     ratioArray[i] = Math.abs(ratio - targetRatio); 
     // Math.min((double)sizes.get(i).width/w, (double)w/sizes.get(i).width); 
     // Math.min((double)h/sizes.get(i).height, (double)sizes.get(i).height/h); 
     //sizes.get(i).width 
     //sizes.get(i).height 

    } 

を使用しないことです

 int min = ratioArray[0]; 
     int minindex; 
     for (int i = 0; i < ratioArray.length; i++) { 
      if(min > ratioArray[i]) { 
min = ratioArray[i]; 
       minindex = i; 
      } 
     } 

そして、あなたはあなたのminindex

+0

計算中にminを直接行うのではなく、2回反復する理由はどこですか? この二重反復の唯一の理由は、後で再利用できるようにratioArrayを保持することです。 このアプローチと質問自体については、最小の比率があなたが得たいものである理由は不明です... – fkerber

+0

はい、それは計算中に行うことができますが、私は理解と簡潔さを高めるためにこの方法を投稿しました...最適化は、まずあなたが望むものを達成するために必要な後半です。 –

+0

はい、これは一般的に正しいです。おそらく、それはあなたの答えの中で私を邪魔しました。 – fkerber

1

最初にすべての比率を計算して並べ替える必要はありますか? 私はforループの比率を計算し(今のように)、それが現在までに計算された最高の比率よりも優れているかどうかをチェックします。はいの場合、それをbestRatioとbestRatioIndexとして保存してください。そうでない場合は、次のループに進みます。 ループの後で、2つの変数に最高の比率とそのインデックスがあります。 正確なマッチングが見つかった場合は、その間にループを残しておくこともできます。

+0

を取得します、あなたは意味ですか。 if(ratio [i-1]> ratio [i]){この比率を使用} else {前のものを使用} – tom91136

+0

これは達成したいことによって異なります。あなたのポストから、私はあなたが望むローテーションに最適なサイズのエントリーを見つけたいと思ったのですか? これは、以前に最も近い比率よりも目標比率に近い場合、比率を計算して取り込むことを意味します。 – fkerber

+0

私は画面(h&w)に最も近い比率を探している場合、私は比を比較し、最小の違いを持つものを見つけるだろう、私の前のコメントは意味があるか、または間違っている? – tom91136

関連する問題