Если вы ищете хороший метод шестнадцатеричных чисел:
boolean isHexDigit(char c) {
return Character.isDigit(c) || (Character.toUpperCase(c) >= 'A' && Character.toUpperCase(c) <= 'F');
}
Подсказки или предложения в соответствии с запросом:
- Все рекурсивные методы вызывают себя с другим входом (ну, надеюсь, другой ввод!)
- Все рекурсивные методы имеют условие остановки.
Ваша сигнатура метода должна выглядеть примерно так
boolean isHexString(String s) {
// base case here - an if condition
// logic and recursion - a return value
}
Кроме того,не забывайте, что шестнадцатеричные строки могут начинаться с "0x".Это может быть (более) трудно сделать, поэтому я бы сначала включил обычную функцию.Если вы решите это позже, постарайтесь помнить, что 0xABCD0x123 не должен проходить.: -)
О подстроке: Прямо из источника класса String:
public String substring(int beginIndex, int endIndex) {
if (beginIndex < 0) {
throw new StringIndexOutOfBoundsException(beginIndex);
}
if (endIndex > count) {
throw new StringIndexOutOfBoundsException(endIndex);
}
if (beginIndex > endIndex) {
throw new StringIndexOutOfBoundsException(endIndex - beginIndex);
}
return ((beginIndex == 0) && (endIndex == count)) ? this :
new String(offset + beginIndex, endIndex - beginIndex, value);
}
смещение является переменной-членом типа int
значение является переменной-членомвведите char[]
, и конструктор, который он вызывает, это
String(int offset, int count, char value[]) {
this.value = value;
this.offset = offset;
this.count = count;
}
Это явно метод O (1), вызывающий конструктор O (1).Это может быть сделано, потому что String неизменен.Вы не можете изменить значение строки, только создать новую.(Давайте отбросим такие вещи, как рефлексия и sun.misc.unsafe
, поскольку они являются посторонними решениями!) Поскольку это не может быть изменено, вам также не нужно беспокоиться о том, что какой-то другой поток будет с ним связываться, поэтому совершенно нормально обойтись какдеревенский велосипед.