2016-07-12 1 views
1

je voulais » ABCDE » pour écrire ma propre méthode compareTo, donc je peux écrire ce code simple:Comment manuellement lexicographique compareTo « ABCD » et « efficace

public int myCompare(String a, String b) { 
    int min = Math.min(a.length(), b.length()); 

    for (int i=0; i < min; i++) { 
     int diff = a.charAt(i) - b.charAt(i); 
     if (diff == 0) { 
      continue; 
     } else { 
      return diff; 
     } 
    } 
    // meaning both strings are equals so far 
    if (a.length() == b.length()) { 
     return 0; 
    } else if (a.length() > b.length()) { 
     return -1; 
    } else { 
     return 1; 
    } 
} 

Eh bien, ce code fonctionne bien, mais je détestez le dernier if/else Instruction- vous avez des suggestions pour améliorer ce code?

Répondre

3

cela dépend de la quantité de celui-ci que vous voulez écrire vous-même. vous pouvez utiliser

return a.length() - b.length(); // as length is non-negative 

ou

return Integer.compareTo(a.length(), b.length()); 

Dans votre première boucle, vous pouvez écrire

for (int i = 0; i < a.length() && i < b.length(); i++) { 
    int diff = a.charAt(i) - b.charAt(i); 
    if (diff != 0) 
     return diff; 
} 
+0

@AndyTurner oui, mais 'char - char' est un 'int' comme un' octet - byte' ou 'octet% byte': P –

+0

Oui, j'ai réalisé ça après l'avoir écrit. Je préfère toujours les méthodes 'WrappedPrimitive.compare', attention. –

+0

@AndyTurner Je me demande souvent pourquoi les programmeurs ont tellement peur des mathématiques de base que des expressions beaucoup plus complexes sont attrayantes. –