Вы не можете. Если JRE может запустить его, приложение может декомпилировать его.
Лучшее, на что вы можете надеяться, это сделать его очень трудным для чтения (замените все символы комбинациями «l» и «1», и 'O' и '0', положить много бесполезного кода и так далее). Вы были бы удивлены, насколько нечитаемы вы можете сделать код, даже с относительно тупым инструментом перевода. Это называется обфускацией и, хотя и не совершенным, иногда бывает адекватным.
Помните, вы не можете остановить определенного хакера больше, чем определенный грабитель. То, что вы пытаетесь сделать, это сделать вещи очень трудными для случайного злоумышленника. Когда представлены символы O001l1ll10O
, O001llll10O
, OO01l1ll10O
, O0Ol11ll10O
и O001l1ll1OO
и код, который, кажется, ничего не полезен, большинство людей просто сдастся.
Я могу придумать ряд возможных решений для более общей проблемы, где диапазоны неравномерны и есть «дырки». Самые простые:
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();
}
Псевдокод:
new int[] {0, 3, 5, 15, 100, 300}
. Arrays.binarySearch()
. 10
в вышеупомянутом массиве будет 3
, поместив его между 5
и 15
, поэтому он будет во втором диапазоне. {0, 1, 2, ...}
. Для более общих случаев следует использовать карту какого-либо рода.
– Stephen C
22 August 2009 в 01:27
Я думаю, что самым простым решением было бы добавить отображения из верхних границ ваших диапазонов в значение, которое соответствует картам, и просто увеличивать ваш номер (ключ на карте) до тех пор, пока вы не достигнете сопоставления (которое является верхним граница для диапазона, в котором находится ваш номер).
Другим способом было бы заполнить карту всеми элементами в диапазоне и добавить отображение для каждого.
Какой из них больше эффективно зависит от того, нужно ли вам повторно запрашивать все числа в диапазоне повторно (используйте последнее решение) или просто некоторые из чисел несколько раз (используйте первый)
В более общем случае, который не может быть решён с помощью арифметики, вы можете создать TreeMap с соответствующим компаратором. Добавьте сопоставления для граничных значений, а затем используйте функцию потолочной или напольной обработки, чтобы найти соответствующее совпадение.
Я думаю, что вы хотите что-то вроде строки foo()/10
, но это даст вам диапазоны немного от того, что вы просили. Вы всегда можете просто сравнивать с двумя конечными точками для каждого элемента вашей «карты», если они не следуют легкому шаблону.