2015-04-10 2 views
-4

Я строю эффективную систему. Мне нужно сравнить строки, которые являются числовыми и могут иметь длину от 0 до 128 и могут иметь нули в начале.Самый быстрый способ сравнения числовых строк 100 строк в java

Я посмотрел в гугле и нашел несколько постов, но никто не считает длину строки, пока 100.

Я создал компаратор, который проверяет нуль, начиная с 0, длина и характер по сравнению символов.

У меня есть другой вариант использования BigInteger. Но не определено, что безопасно и быстро.

, и если BigInteger быстро, я не знаю, что делает его реализацию быстро.

Вы хотите знать, что лучше всего, безопасный и надежный практик для сравнения числовых строк длины по меньшей мере 100.

Почему Второй один с большим целым числом бежит быстро?

////

общественность статическая булевы isGreaterSequence1 (конечная строка newSequence, конечная строка oldSequence) {

if (newSequence == null || oldSequence == null || newSequence.isEmpty() || oldSequence.isEmpty()) { 
     return false; 
    } 
    final String oldSequenceModified = getWithoutStartZero(oldSequence); 

    final String newSequenceModified = getWithoutStartZero(newSequence); 
    if (oldSequenceModified.compareTo(newSequenceModified) > 0) { 
     return true; 
    } 

    return false; 
} 

    public static String getWithoutStartZero(final String input) { 
    final int length = input.length(); 
    int end = 0; 
    while (end < length) { 
     if (input.charAt(end) != '0') { 
      break; 
     } 
     end++; 
    } 

    return input.substring(end, length); 
} 

public static boolean tempCompare(final String newSequence, final String oldSequence) { 
    final BigInteger ns = new BigInteger(newSequence); 
    final BigInteger os = new BigInteger(oldSequence); 
    final int res = ns.compareTo(os); 
    if (res > 0) { 
     return true; 
    } 
    return false; 
} 

//

+1

Просьба уточнить, следует ли игнорировать ведущие нули. то есть «00096»> «096»> «96»? – OldCurmudgeon

+0

Не совсем уверен, что вы просите ... – Haris

+0

Как насчет знака? – luk32

ответ

0

Вы можете щелкнуть левую набивку с 0 кратчайшей строкой и чем сравнивайте их как обычные строки.

Так, если строки

public static final String ZEROS = "0000000000000000000000000000000"; // As long as you need 
public int compare(String str1, String str2) { 
    if (str1.length > str2.length) { 
     str2 = ZEROS.substr(0, str1.length - str2.length) + str2; 
    } else { 
     str1 = ZEROS.substr(0, str2.length - str1.length) + str1; 
    } 
    return str1.compareTo(str2); 
} 

Если строка не может начинаться с нулями вы можете сделать более эффективную реализацию, как следующий:

public int compareIfNotStartingWith0(String str1, String str2) { 
    if (str1.length != str2.length) { 
     return str1.length - str2.length; 
    } 
    return str1.compareTo(str2); 
} 
+0

это быстрее, чем другие способы? –

1

Получить длину. Затем запустите итерацию обеих строк, пропуская ведущие нули, посчитайте их. Сравнить length - zeroes. Если не равный доход, тем больше, чем больше.

В противном случае продолжите итерацию, сравнивая символ для символа. Если он не равен, один больше другого.

Хитрость заключается в том, чтобы вручную пропустить нули и продолжить сравнение персонажа по символу. Таким образом, вы не будете читать ни одного персонажа дважды. Обычно я бы посоветовал не получить длину, но в java это дано в любом случае, и избежать этого невозможно.

Преобразование в bigint не будет более быстрым, потому что оно должно читать строку в любом случае. Хорошо читайте и разбирайте, здесь вы только читаете.

В любом случае, это выглядит как микро-оптимизация, если честно. Это имело бы значение только для сравнения строк очень различной длины.

+0

хорошо я думал то же самое и делал точно, что вы упомянули, а затем запускал тестовый пример со 100000 строк, чтобы узнать, требует ли большое целое число больше времени или этой реализации. и найденное большое целое занимает половину времени. Не знаю, почему это занимает меньше времени. –

+1

Вам нужно будет опубликовать конкретную реализацию. – luk32

0

Первый фрагмент кода для сравнения строк должен был быть победителем, но некоторые из них, как я получал меньше времени для выполнения большого целочисленного фрагмента кода. Это произошло из-за того, что у меня был азартный логгер в моем коде сравнения строк, который занимал все дополнительное время, и он отсутствовал в большом целочисленном коде. Столь большое целое медленное, потому что он делает дополнительную работу по преобразованию строки в большое целое.

Смежные вопросы