Избавиться от некрасивых высказываний - PullRequest
60 голосов
/ 24 сентября 2010

У меня есть этот уродливый код:

if ( v > 10 ) size = 6;
if ( v > 22 ) size = 5;
if ( v > 51 ) size = 4;
if ( v > 68 ) size = 3;
if ( v > 117 ) size = 2;
if ( v > 145 ) size = 1;
return size;

Как мне избавиться от нескольких операторов if?

Ответы [ 25 ]

0 голосов
/ 27 сентября 2010

Это мой пример кода с использованием SortedSet. Вы инициализируете границы один раз.

SortedSet<Integer> boundaries = new SortedSet<Integer>;

boundaries.add(10);

boundaries.add(22);

boundaries.add(51);

boundaries.add(68);

boundaries.add(117);

boundaries.add(145);

Затем используйте его таким образом для нескольких значений v (и инициализированного размера)

SortedSet<Integer> subset =  boundaries.tailSet(v);
if( subset.size() != boundaries.size() )
  size = subset.size() + 1;
0 голосов
/ 30 ноября 2012

Еще один вариант (менее выраженный, чем ответ Джордж )

  //int v = 9;
  int[] arr = {145, 117, 68, 51, 22, 10};
  int size = 7; for(;7 - size < arr.length && v - arr[size - 2] > 0; size--) {};
  return size;
0 голосов
/ 20 ноября 2012
            if (v <= 10)
                return size;
            else {
                size = 1;

                if (v > 145)
                    return size;
                else if (v > 117)
                    return ++size;
                else if (v > 68)
                    return (size+2);
                else if (v > 51)
                    return (size+3);
                else if (v > 22)
                    return (size+4);
                else if (v > 10)
                    return (size+5);
            }

Это выполнит необходимые операторы if.

0 голосов
/ 30 сентября 2010

Интересно, что есть много красивых ответов на простой «уродливый» вопрос. Мне больше нравится ответ mfloryan, однако я бы продвинул его дальше, удалив жестко закодированный массив внутри метода. Что-то вроде

int getIndex(int v, int[] descArray) {
    for(int i = 0; i < descArray.length; i++)
        if(v > descArray[i]) return i + 1;
    return 0;
}

Теперь он становится более гибким и может обрабатывать любой заданный массив в порядке убывания, и метод найдет индекс, которому принадлежит значение 'v'.

PS. Я пока не могу комментировать ответы.

0 голосов
/ 28 сентября 2010

Если вы действительно хотите самое быстрое решение со сложным временем для этого конкретного ответа, это постоянный поиск.

final int minBoundary = 10;
final int maxBoundary = 145;
final int maxSize = 6;
Vector<Integer> index = new Vector<Integer>(maxBoundary);
    // run through once and set the values in your index

впоследствии

if( v > minBoundary )
{
   size = (v > maxBoundary ) ? maxSize : index[v];
}

То, что мы здесь делаем, - это маркировка всех возможных результатов v в пределах диапазона и места их падения, и тогда нам нужно только проверить граничные условия.

Проблема в том, что он использует больше памяти и, конечно, если maxBoundary будет намного больше, это будет очень неэффективно в пространстве (а также потребует больше времени для инициализации).

Иногда это может быть лучшим решением для ситуации.

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