Структура данных, которая будет использоваться для отображения диапазона оценок для каждого градиента [дубликата]

Вы не можете. Если JRE может запустить его, приложение может декомпилировать его.

Лучшее, на что вы можете надеяться, это сделать его очень трудным для чтения (замените все символы комбинациями «l» и «1», и 'O' и '0', положить много бесполезного кода и так далее). Вы были бы удивлены, насколько нечитаемы вы можете сделать код, даже с относительно тупым инструментом перевода. Это называется обфускацией и, хотя и не совершенным, иногда бывает адекватным.

Помните, вы не можете остановить определенного хакера больше, чем определенный грабитель. То, что вы пытаетесь сделать, это сделать вещи очень трудными для случайного злоумышленника. Когда представлены символы O001l1ll10O, O001llll10O, OO01l1ll10O, O0Ol11ll10O и O001l1ll1OO и код, который, кажется, ничего не полезен, большинство людей просто сдастся.

32
задан kal 22 August 2009 в 01:37
поделиться

5 ответов

Я могу придумать ряд возможных решений для более общей проблемы, где диапазоны неравномерны и есть «дырки». Самые простые:

  1. Просто заполните Map для всех допустимых значений ключа, с сопоставлением нескольких ключей с тем же значением. Предполагая, что вы используете HashMaps, это должен быть самый эффективный (O (1) поиск), хотя у вас больше времени на настройку, и вы используете больше места.
  2. Используйте навигационную карту и используйте floorEntry(key) для поиска.

Вот решение, использующее NavigableMaps, которое допускает «дыры» в отображении.

Это решение должно быть менее эффективным (O (log (N) »)
private static class Range {
   public int upper, value;
   ...
}

NavigableMap<Integer, Range> map = new TreeMap<Integer, Range>();
map.put(0, new Range(3, 0));       // 0..3     => 0
map.put(5, new Range(10, 1));      // 5..10    => 1
map.put(100, new Range(200, 2));   // 100..200 => 2

// To do a lookup for some value in 'key'
Map.Entry<Integer,Range> entry = map.floorEntry(key);
if (entry == null) {
    // too small
} else if (key <= entry.getValue().upper) {
    return entry.getValue().value;
} else {
    // too large or in a hole
}

С другой стороны, если нет «дырок», решение проще:

NavigableMap<Integer, Integer> map = new TreeMap<Integer, Integer>();
map.put(0, 0);    // 0..4     => 0
map.put(5, 1);    // 5..10    => 1
map.put(11, 2);   // 11..200  => 2

// To do a lookup for some value in 'key'
if (key < 0 || key > 200) {
    // out of range
} else {
   return map.floorEntry(key).getValue();
}
71
ответ дан Stephen C 19 August 2018 в 03:47
поделиться
  • 1
    Это очень хорошее использование существующей TreeMap для простого поиска диапазона. Обратите внимание, что если есть перекрывающиеся интервалы, то подход вернет этот интервал с ближайшим нижним ключом к клавише поиска. Аналогичным образом, этот подход не поддерживает поиск всех перекрывающихся интервалов, содержащих данный ключ поиска, как описано в stackoverflow.com/questions/1580185/… – stackoverflowuser2010 7 November 2011 в 20:45
  • 2
    Если имеются перекрывающиеся диапазоны, то диапазоны (скорее всего) указаны неправильно. По крайней мере, это мое чтение ЭТОГО вопроса. – Stephen C 21 March 2013 в 07:16

Псевдокод:

  1. Сохранение границ диапазона в плоском массиве: new int[] {0, 3, 5, 15, 100, 300}.
  2. Двоичный поиск по массиву, как будто вставка числа в массив , См. Arrays.binarySearch() .
  3. Если точка ввода четна, число не помещается в какой-либо диапазон.
  4. Если точка ввода нечетна, вписывается в соответствующий диапазон. Например, точкой вставки для 10 в вышеупомянутом массиве будет 3, поместив его между 5 и 15, поэтому он будет во втором диапазоне.
10
ответ дан John Kugelman 19 August 2018 в 03:47
поделиться
  • 1
    Примечание: это работает, только если мы сопоставляем целые числа {0, 1, 2, ...}. Для более общих случаев следует использовать карту какого-либо рода. – Stephen C 22 August 2009 в 01:27

Я думаю, что самым простым решением было бы добавить отображения из верхних границ ваших диапазонов в значение, которое соответствует картам, и просто увеличивать ваш номер (ключ на карте) до тех пор, пока вы не достигнете сопоставления (которое является верхним граница для диапазона, в котором находится ваш номер).

Другим способом было бы заполнить карту всеми элементами в диапазоне и добавить отображение для каждого.

Какой из них больше эффективно зависит от того, нужно ли вам повторно запрашивать все числа в диапазоне повторно (используйте последнее решение) или просто некоторые из чисел несколько раз (используйте первый)

0
ответ дан Jorn 19 August 2018 в 03:47
поделиться

В более общем случае, который не может быть решён с помощью арифметики, вы можете создать TreeMap с соответствующим компаратором. Добавьте сопоставления для граничных значений, а затем используйте функцию потолочной или напольной обработки, чтобы найти соответствующее совпадение.

3
ответ дан Ken 19 August 2018 в 03:47
поделиться

Я думаю, что вы хотите что-то вроде строки foo()/10, но это даст вам диапазоны немного от того, что вы просили. Вы всегда можете просто сравнивать с двумя конечными точками для каждого элемента вашей «карты», если они не следуют легкому шаблону.

0
ответ дан Sophie Alpert 19 August 2018 в 03:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: