2014-01-27 11 views
0

Я хочу, чтобы сравнить два строки, которые имеют те формыСравните две длинные строки

s1="1390785186301" 
s2="1390785191301" 

Должен ли я конвертировать их в длинные, а затем сравнить с > или есть методы?

+1

Если они уже являются строками, то почему бы просто не использовать 'String # compareTo()' или 'String # equals()'? – PakkuDon

+1

@PakkuDon Он хочет знать, что больше. – Maroun

+3

Какова природа сравнения, которое вы хотите сделать? Чтобы узнать, равны ли они, сравнить лексически (т.е. как в словаре) или сравнить преобразованное значение? – adrianmcmenamin

ответ

1

Если вы хотите сравнить две строки, просто использовать метод CompareTo

if(s1.length() == s2.length()){  
    if(s1.compareTo(s2) > 0) {//then s1 is greater...} 
} 

Посмотрите на Javadoc

String#compareTo

+0

Неправильно. Это даст вам лексикографический порядок. –

+0

ах, но откуда вы узнаете, что он хочет или нет :) –

+0

Это прекрасно работает, пока две строки имеют одинаковую длину. –

-1
if (new Long(s1) > new Long(s2)) 
    // do your thing 

Я не вижу никаких причин, чтобы не создать лонги для этого.

Вот подробнее: http://docs.oracle.com/javase/6/docs/api/java/lang/Long.html#Long%28java.lang.String%29

+0

Это ужасно неэффективно. –

+1

Это может быть правдой, но если у вас нет проблем с производительностью/ограничений, вы никогда не будете делать преждевременную оптимизацию. Конечно, вы можете писать пошаговые компараторы, но только если это действительно необходимо. Сначала сделайте это, затем сделайте это правильно, затем сделайте это быстро. :) –

+0

Конечно нет. Но я не говорю о преждевременной оптимизации. Я говорю о том, что вы делаете совершенно ненужный бокс и распаковываете только для синтаксического анализа строки. Просто используйте 'Long.parseLong',' Long.valueOf' будет лучше, чем у вас, но 'Long.parseLong' лучше, чем для этого случая. –

1

Рассмотрите возможность использования this natural comparator, в случае, если вы не уверены, если есть только цифры в строке.

+0

Не самый эффективный ответ, но +1 для полезной ссылки в случае смешанного контента. –

1

Проблема с использованием сравнения строк заключается в том, что в строке сравнения 12 приходит до 9, а не после нее.

Вам нужно будет преобразовать его в long (если он соответствует диапазону 64-битного целого) или BigInteger, а затем выполните сравнение, используя их.

Для долго:

if (Long.parseLong(str1) > Long.parseLong(str2)) { 
} 

или:

int comparison = Long.compare(Long.parseLong(str1), Long.parseLong(str2)); 

Окончательный вариант должен был бы сделать свой собственный струнный компаратор, который сканирует с начала строки сравнения одну цифру в то время, но если строки не равны, то обрабатывается более короткая, как если бы она оставалась заполненной 0.

+0

Истина, «12» предшествует (отображается меньше) «9». Но «12» приходит после «09». Если строки имеют одинаковую длину, то сравнение строк вполне достаточно. –

+0

@HotLicks True, но только если строки имеют одинаковую длину и не содержат десятичных точек и не содержат тысяч разделителей (или одинаковых разделителей). Однако рискованно делать это предположение. –

+0

Если строки содержат десятичные точки, то parseLong не будет работать. –

-1

В зависимости от того, что вам нужно, вы можете проверить, содержит ли обе строки точно такую ​​же ценность e с использованием метода equals (при отсутствии начальных нулей и того, что оба числа представлены с использованием тех же обозначений, например "101" и "1.01E2" представляют одно и то же значение, но строки не равны).

Но если вы хотите проверить, какая строка содержит больше value Строка не дает большой помощи. Он имеет свой собственный compareTo метод, но он использует алфавитный порядок, который может потерпеть неудачу, если

  • строка не такие же длины: так же, как ab будут помещены перед b в словаре, то же правило относится и к "12""2", что означает, что 12 < 2 используя этот заказ
  • Мы сравниваем отрицательные значения: пример 12 < 13 в алфавитном порядке, но это также означает -12 < -13.

Это намного проще и безопаснее для преобразования строк в правильный числовой тип, как Long, BigInteger или даже BigDecimal и использовать соответствующие методы, такие как compareTo.

Demo

String s1 = "1390785186301"; 
String s2 = "1390785191301"; 

System.out.println(Long.compare(Long.parseLong(s1), Long.parseLong(s2))); // -1 
System.out.println(new BigInteger(s1).compareTo(new BigInteger(s2)));  // -1 

отрицательное значение a.compareTo(b) указывает на то, что a<b, 0, что a==b, положительный что a>b

Demo 2:

BigDecimal bigDecimal = new BigDecimal("101"); 
BigDecimal bigDecimal2 = new BigDecimal("1.01E2"); 
System.out.println(bigDecimal.equals(bigDecimal2)); // true 
System.out.println(bigDecimal.compareTo(bigDecimal2)); // 0 
+0

@downvoter Оставить комментарий? Я с удовольствием улучшу свой ответ, если вы сообщите мне, что с ним не так. – Pshemo

+0

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

0

Вот полный анс

public class Comparetion { 
    public static void main(String args[]){ 
     String s1="1390785186301"; 
     String s2="1390785191301"; 


     if (s1.compareTo(s2) == 0) { 
      System.out.println("s1 and S2 its same"); 
     } 
     if (s1.compareTo(s2) > 0) { 
      System.out.println("S1 is bigger then s2"); 
     } 
     if (s1.compareTo(s2) < 0) { 
      System.out.println("S2 is less then S1"); 
     } 
    } 

} 

public class Comparetion { 
    public static void main(String args[]){ 
     String s1="1390785186301"; 
     String s2="1390785191301"; 


     if (Long.parseLong(s1) < Long.parseLong(s2)) { 
      System.out.println("s1 is less then s2"); 
     } 
     else if(Long.parseLong(s1) > Long.parseLong(s2)){ 

      System.out.println("s1 is bigger then s2"); 
     } 
     else{ 
      System.out.println("s1 and s2 are same."); 

     } 
    } 

} 

две возможности. но в случае Compare to получат исключительные случаи.

+0

Это даст неправильный результат для сравнения «12» с «9». –

+0

нет, он не даст просто взять s1 как 12 и s2 как 9, и это даст результат правильно .. отметьте один раз. и ya для некоторых особых случаев, которые он даст bcoz, будет преобразование двоичного кода, и u получит ans. поэтому могут быть исключительные случаи. – Krishna

+0

Действительно? В сравнении строк 1 приходит до 9 и проверяет один символ за раз, поэтому сразу вам сообщают, что 12 до 9 ... –

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