В настоящее время я смотрю на простую проблему программирования, которую было бы интересно оптимизировать - по крайней мере, для любого, кто считает, что программирование - это искусство :) Вот оно:
Как лучше всего представлять длинные как строки, сохраняя их естественный порядок?
Кроме того, строковое представление должно соответствовать ^[A-Za-z0-9]+$
. (Здесь я не слишком строг, но избегайте использования управляющих символов или чего-либо, что может вызвать головную боль при кодировании, недопустимо в XML, имеет разрывы строк или подобные символы, которые, безусловно, вызовут проблемы) *
Вот тестовый пример JUnit:
@Test
public void longConversion() {
final long[] longs = { Long.MIN_VALUE, Long.MAX_VALUE, -5664572164553633853L,
-8089688774612278460L, 7275969614015446693L, 6698053890185294393L,
734107703014507538L, -350843201400906614L, -4760869192643699168L,
-2113787362183747885L, -5933876587372268970L, -7214749093842310327L, };
// keep it reproducible
//Collections.shuffle(Arrays.asList(longs));
final String[] strings = new String[longs.length];
for (int i = 0; i < longs.length; i++) {
strings[i] = Converter.convertLong(longs[i]);
}
// Note: Comparator is not an option
Arrays.sort(longs);
Arrays.sort(strings);
final Pattern allowed = Pattern.compile("^[A-Za-z0-9]+$");
for (int i = 0; i < longs.length; i++) {
assertTrue("string: " + strings[i], allowed.matcher(strings[i]).matches());
assertEquals("string: " + strings[i], longs[i], Converter.parseLong(strings[i]));
}
}
а вот методы, которые я ищу
public static class Converter {
public static String convertLong(final long value) {
// TODO
}
public static long parseLong(final String value) {
// TODO
}
}
У меня уже есть идеи о том, как подойти к этой проблеме. Тем не менее, я думаю, что я мог бы получить хорошие (творческие) предложения от сообщества.
Кроме того, было бы неплохо, если бы это преобразование было
- как можно короче
- легко реализовать на других языках
РЕДАКТИРОВАТЬ: Я очень рад видеть, что два очень уважаемых программиста столкнулись с той же проблемой, что и я: использование «-» для отрицательных чисел не может работать, так как «-» не меняет порядок сортировки :
- -0001
- -0002
- 0000
- 0001
- 0002