Comparer des sous-chaînes en Java

J’écris une méthode qui retournera la valeur true si l’une des chaînes apparaît tout à la fin de l’autre chaîne et que les chaînes sont différentes. Nous ne pouvons pas utiliser endsWith ()

Par exemple:

Voici ce que j’ai jusqu’à présent, mais cela n’arrête pas de dire que l’index de chaîne est hors de scope = -1

public static boolean startOther(Ssortingng a, Ssortingng b){ if(a.equals(b)) return false; int pos=a.indexOf(b); int pos1=b.indexOf(a); int len=a.length(); int len1=b.length(); if(pos>-1 && a.subssortingng(len-pos).equals(b)|| pos1>-1 && b.subssortingng(len1-pos1).equals(a)) return true; return false; } 

C’est un peu “regarder avant de sauter”, mais ce que vous voulez faire, c’est:

  • Vérifiez l’emplacement d’index de chaque chaîne dans une autre.
  • Si (et seulement si) l’emplacement d’index existe, vérifiez si la sous-chaîne de cet index correspond jusqu’à la fin .
  • Sinon, retourne false.

Si vous faites une sorte de soustraction, vous n’obtiendrez pas la taille correcte de la sous-chaîne; c’est-à-dire que si vous soustrayez la longueur de la chaîne que vous vérifiez, vous n’obtiendrez qu’un seul caractère.

 public static boolean startOther(Ssortingng left, Ssortingng right) { if (left == null || right == null || left.equals(right)) { return false; } int rightSubssortingngInLeft = left.indexOf(right); int leftSubssortingngInRight = right.indexOf(left); if(rightSubssortingngInLeft != -1) { return left.subssortingng(rightSubssortingngInLeft).equals(right); } else if(leftSubssortingngInRight != -1) { return right.subssortingng(leftSubssortingngInRight).equals(left); } else { return false; } } 

Voici une forme plus optimisée du même code, comme indiqué dans les commentaires. C’est fondamentalement la même chose, mais vous n’avez pas besoin d’effectuer un autre contrôle égal à la sous-chaîne, car lastIndexOf ne vous donnera jamais que le dernier index de la sous-chaîne entière.

 public static boolean startOther(Ssortingng left, Ssortingng right) { if (left == null || right == null || left.equals(right)) { return false; } int rightSubssortingngInLeft = left.lastIndexOf(right); int leftSubssortingngInRight = right.lastIndexOf(left); if(rightSubssortingngInLeft != -1) { return rightSubssortingngInLeft == left.length() - right.length(); } else if(leftSubssortingngInRight != -1) { return leftSubssortingngInRight == right.length() - left.length(); } else { return false; } } 

Comme vous ne pouvez pas utiliser endsWith , commencez par tester null . Ensuite, prenez les longueurs. Testez qu’ils ne sont pas les mêmes. Vérifiez que indexOf + length est égal à true . Quelque chose comme

 public static boolean startOther(Ssortingng a, Ssortingng b) { if (a == null || b == null) return false; int aLen = a.length(); int bLen = b.length(); if (aLen != bLen) { if (aLen < bLen) { int p = b.indexOf(a); return p != -1 && p + aLen == bLen; } else { int p = a.indexOf(b); return p != -1 && p + bLen == aLen; } } return false; } 

que j'ai testé comme

 public static void main(Ssortingng[] args) { System.out.println(startOther("all", "ball")); System.out.println(startOther("yes", "yes")); } 

et obtenu la sortie (demandée)

 true false 
 indexOf(Ssortingng s) 

Retourne: l’index de la première occurrence de la sous-chaîne spécifiée, ou -1 s’il n’y en a pas.

Si indexOf() renvoie -1 et que vous appelez une a.subssortingng(len-pos) , le paramètre sera len - (-1) = len + 1 . C’est la cause de out of range .

Ce cas se produit toujours dans votre code, à cause de deux lignes en miroir:

 int pos=a.indexOf(b); int pos1=b.indexOf(a); 

Si vous avez coché égal à avant l’appel de la méthode, l’un des pos deviendra toujours -1. C’est évident: si une chaîne en contient une autre et qu’elles ne sont pas égales, la deuxième chaîne n’en contient pas la première.

Une combinaison de length() et de regionMatches(int toffset, Ssortingng other, int ooffset, int len) devrait être relativement efficace:

 public static boolean startOther(final Ssortingng a, final Ssortingng b) { final int aLength = a.length(); final int bLength = b.length(); return aLength != bLength && (aLength > bLength ? a.regionMatches(aLength - bLength, b, 0, bLength) : b.regionMatches(bLength - aLength, a, 0, aLength)); }