JAVA : comparaison de deux String de formats différents

Résolu/Fermé
Milly7534 Messages postés 26 Date d'inscription jeudi 12 juin 2014 Statut Membre Dernière intervention 27 avril 2015 - 12 juin 2014 à 15:08
Milly7534 Messages postés 26 Date d'inscription jeudi 12 juin 2014 Statut Membre Dernière intervention 27 avril 2015 - 20 juin 2014 à 11:30
Bonjour,

Je dois actuellement programmer une fonction Java qui prend en paramètre un String
et qui va parcourir un fichier et comparer les données à la chaîne en entrée et m'afficher si oui ou non il y a correspondance.
Je cherche à mettre en correspondance des identifiants qui représentent le même objet mais qui n'ont pas le même format, ce qui pose problème pour la comparaison.

Exemple :

En entrée, ma chaîne est de la forme lettres-chiffresUnStringEnMinuscules et dans le fichier, tout est sous cette forme : chiffres-UnStringEnMajuscules.
Pour qu'il y ait correspondance, je dois vérifier que les "chiffres" sont égaux ainsi que les "UnString".

J'ai essayé différentes fonctions et les regex, sans obtenir ce que je voulais et je sèche un peu.
Quelqu'un connaîtrait-il un moyen efficace ?

Merci d'avance pour votre aide !
A voir également:

6 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
Modifié par KX le 12/06/2014 à 22:37
Bonsoir,

Pour comparer des String de formats différents, il faut d'abord les convertir dans un format commun puis les comparer normalement. Exemple :

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test
{
    private static final Pattern PATTERN_1 = Pattern.compile("[A-Z]+-([0-9]+)([a-z]+[0-9]+)");
    private static final Pattern PATTERN_2 = Pattern.compile("([0-9]+)-([A-Z]+[0-9]+)");
    
    public static String convert(String str)
    {
        Matcher matcher1 = PATTERN_1.matcher(str);
        if (matcher1.matches())
            return matcher1.group(1) + matcher1.group(2);
        
        Matcher matcher2 = PATTERN_2.matcher(str);
        if (matcher2.matches())
            return matcher2.group(1) + matcher2.group(2).toLowerCase();
        
        return str;
    }
    
    public static boolean compare(String str1, String str2)
    {
        return convert(str1).equals(convert(str2));
    }
    
    public static void main(String[] args)
    {
        String str1 = "10-CHAINE3";
        String str2 = "AA-10chaine3";
        
        System.out.println(convert(str1)); // 10chaine3
        System.out.println(convert(str2)); // 10chaine3
        System.out.println(compare(str1, str2)); // true
    }
}
La confiance n'exclut pas le contrôle
2
Milly7534 Messages postés 26 Date d'inscription jeudi 12 juin 2014 Statut Membre Dernière intervention 27 avril 2015
13 juin 2014 à 09:24
Merci ! Effectivement ça marche bien :)
On les convertit donc avec les deux regex du début. Mais j'ai du mal avec les symboles, elles signifient quoi ?
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015 > Milly7534 Messages postés 26 Date d'inscription jeudi 12 juin 2014 Statut Membre Dernière intervention 27 avril 2015
13 juin 2014 à 18:23
Bonjour,

Tu trouveras toute la documentation sur le format des regex en Java dans la javadoc de la classe Pattern :

https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html

Ceci dit, les expressions que j'ai utilisé sont très basiques et tout les langages courants les utilise donc tu peux prendre n'importe quelle documentation pour les comprendre, y a vraiment rien de difficile ici.
0
Milly7534 Messages postés 26 Date d'inscription jeudi 12 juin 2014 Statut Membre Dernière intervention 27 avril 2015
20 juin 2014 à 11:29
Merci ! :)
0
Hello,

Je pense qu'il te faut utiliser la fonction matches :

 String a = "looool";
  
 if(a.matches(".*ooo.*")){
  System.out.println("ok");
 }


Retourne ok.

Mon programme retournera ok pour tous les Strings qui contiennent "ooo".

Source :
https://stackoverflow.com/questions/15130309/how-to-use-regex-in-string-contains-method-in-java
1
Dinath Messages postés 1602 Date d'inscription vendredi 12 avril 2013 Statut Contributeur sécurité Dernière intervention 6 novembre 2021 218
12 juin 2014 à 16:44
Double +1 pour le pseudo ;-)

Tu devrais t'inscrire.
0
ProvencaleLeGaulois Messages postés 48 Date d'inscription lundi 2 juin 2014 Statut Membre Dernière intervention 18 septembre 2014 6
12 juin 2014 à 16:47
Je suis inscrit mais j'ai posté le message sans être connecté ;)
Merci pour le plussoiement et mes respects au fan de Kaamelott :)
0
Dinath Messages postés 1602 Date d'inscription vendredi 12 avril 2013 Statut Contributeur sécurité Dernière intervention 6 novembre 2021 218
12 juin 2014 à 17:06
Haha mais de rien, tu es une légende après tout ;-)
0
Dinath Messages postés 1602 Date d'inscription vendredi 12 avril 2013 Statut Contributeur sécurité Dernière intervention 6 novembre 2021 218
12 juin 2014 à 16:06
Salut,

Désolé je ne comprends pas.

Tu aurais un exemple précis ?

String 1 = ?
String 2 = ?

Que veux-tu comparer ?

C'est un peu flou :)
0
Milly7534 Messages postés 26 Date d'inscription jeudi 12 juin 2014 Statut Membre Dernière intervention 27 avril 2015
12 juin 2014 à 16:22
Désolée ^^
Voici un exemple concret :

Le paramètre de ma fonction (le string dont je cherche à vérifier l'existence) = AA-10chaine3

Mon fichier :

01-CHAINE1
02-CHAINE3
10-CHAINE2
...
10-CHAINE3

La chaîne correcte parmi celles du fichier est "10-CHAINE3" car on retrouve à la fois le 10 et chaine3.
Donc si mon paramètre est "AA-10chaine3", ma fonction doit me renvoyer qu'il y a bien une occurrence dans le fichier car il existe "10-CHAINE3".
Mais comment s'y prendre pour que la fonction y arrive ?

J'espère que c'est plus clair :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Dinath Messages postés 1602 Date d'inscription vendredi 12 avril 2013 Statut Contributeur sécurité Dernière intervention 6 novembre 2021 218
12 juin 2014 à 16:30
D'accord, on va tout reprendre :)

function (String s="AA-10chaine3") {

traitement...

si correspondance entre s et "10-CHAINE3" on retourne vrai

}

C'est un algo de ce style que tu veux ?

Donc tu veux simplement comparer AA-10chaine3 et 10-CHAINE3 ?

0
Milly7534 Messages postés 26 Date d'inscription jeudi 12 juin 2014 Statut Membre Dernière intervention 27 avril 2015
12 juin 2014 à 16:37
C'est ça ! Mais comme je veux faire une fonction générique, ça me bloque....je me demande si c'est possible ou s'il faut connaître le format des chaînes à l'avance.

Sinon oui, j'aimerais qu'elle renvoie true si elle trouve la chaîne (en se fichant des majuscules ou des minuscules) et le bon nombre.
0
Dinath Messages postés 1602 Date d'inscription vendredi 12 avril 2013 Statut Contributeur sécurité Dernière intervention 6 novembre 2021 218
12 juin 2014 à 16:44
0
ProvencaleLeGaulois Messages postés 48 Date d'inscription lundi 2 juin 2014 Statut Membre Dernière intervention 18 septembre 2014 6
Modifié par ProvencaleLeGaulois le 12/06/2014 à 17:46
Hello,

Et si tu ne veux pas tenir compte des majuscules, tu peux faire :
  String a = "loOOOol";
  
  if(a.toLowerCase().matches(".*ooo.*")){
   System.out.println("ok");
  }


A+
0
Milly7534 Messages postés 26 Date d'inscription jeudi 12 juin 2014 Statut Membre Dernière intervention 27 avril 2015
12 juin 2014 à 21:53
Merci pour l'exemple.
Hélas, ça ne marche pas avec mes données :(
0
Milly7534 Messages postés 26 Date d'inscription jeudi 12 juin 2014 Statut Membre Dernière intervention 27 avril 2015
20 juin 2014 à 11:30
Merci pour votre aide, j'ai réussi à coder mes fonctions ! :)
0