получить оригинальный индекс отсортированного массива в Java (Android) - PullRequest
0 голосов
/ 04 января 2012

В моем коде я получил список элементов для циклического прохождения и вычисления некоторых значений, теперь:

        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 ]

2 голосов
/ 04 января 2012

Лучший способ - это перебрать соотношение массива и НЕ использовать 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;
            }
        }

И вы получите свой мини-индекс

1 голос
/ 04 января 2012

Есть ли необходимость сначала вычислить все отношения, а затем отсортировать их?Я бы вычислил соотношение в цикле for (как вы это делаете сейчас) и затем проверил, лучше ли оно, чем лучшее вычисленное соотношение до сих пор.Если да, сохраните его (и его индекс) как bestRatio и bestRatioIndex и продолжайте - если нет, просто переходите к следующему циклу.После цикла у вас есть лучшее соотношение и его индекс в двух переменных.Вы можете даже оставить цикл между ними, если найдете точное соответствие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...