IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Extraire et découper une chaîne


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 83
    Par défaut Extraire et découper une chaîne
    (re)Bonjour à tous,
    J'ai un point bloquant sur un traitement d'une chaine de caractère que je dois faire, je m'explique, j'ai une chaine comme suit : UACACGCAUACGCGGCAUUUA, je souhaite qu'en appuyant sur un bouton, la chaine soit exportée en étant découpée et en rajoutant deux trois trucs vers une textview.

    Pour résumer :
    Input : UACACGCAUACGCGGCAUUUA

    je presse le bouton

    Output :
    UAC T
    ACG E
    CAU F
    ACG A
    CGG B
    CAU R
    UUA H

    En gros, on coupe la chaine tous les trois caractères, on regarde si la chine de trois existe dans un tableau, si oui on ajoute à côté la lettre correspondante, sinon on n'ajoute rien, on va à ligne, on prend les trois caractères suivants...

    Je suis complètement perdu vers l'orientation de mes recherches pour réussir à faire ça.

    Merci par avance.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    La méthode substring(start, end) te permet d'extraire une sous-chaîne d'une chaîne, depuis le caractère de position start, jusqu'au caractère précédent le caractère de position end. Donc il te suffit de faire une boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    String chaineADecouper = /*... */;
    for(int i=0; i<chaineADecouper.length; i+=3 /* on avance de 3 en 3*/) {
     
        String mot = chaineADecouper.substring( i, Math.min( i+3 /* 3 caractères plus loin */, chaineADecouper.length) ); // j'ai pris la précaution de ne pas dépasser de la fin (si des fois le nombre de caractères n'était pas multiple de 3
     
        System.out.print(mot);
        if ( appartientATableau(mot) ) {
             System.out.print(" ");
             System.out.print(lettreAssocieeAMot(mot));
        }
        System.out.println();
     
    }
    Pour le test d'appartenance à un tableau, par contre, un tableau ce n'est pas très efficace pour ça : tu devrais t'orienter vers une Map (comme une HashMap par exemple) pour stocker les accociations entre trigrammes et lettre. Avec une map, appartientATableau(mot) s'écrira map.containsKey(mot) et lettreAssocieeAMot(mot), map.get(mot).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 83
    Par défaut
    Bonjour,
    Merci joel.drigo pour ta réponse qui est exactement ce que je cherche.

    J'ai donc suivi ton code en rajoutant en effet les données sous forme d'un HashMap, ce qui me donne comme code :

    java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    HashMap map = new HashMap();
     
            //Map
            map.put("AAA", "K");
            map.put("AAC", "N");
            map.put("AAG", "K");
     
            EditText input =(EditText)rootview.findViewById(R.id.input);
            String chaineADecouper = input.getText().toString();
     
            for(int i=0; i<chaineADecouper.length(); i+=3 /* on avance de 3 en 3*/) {
     
                String mot = chaineADecouper.substring( i, Math.min( i+3 /* 3 caractères plus loin */, chaineADecouper.length()) );
     
                System.out.print(mot);
                if ( map.containsKey(mot) ) {
                    System.out.print(" ");
                    System.out.print(map.get(mot));
                }
                System.out.println();
     
            }
    }
    (à noter que j'ai modifié les chaineADecouper.length en chaineADecouper.length(), sinon ça ne passait pas )

    Du coup, là j'ai bien dans le logcat la sortie suivante :
    AAA K
    AAC N
    AAG K

    Par contre, je n'arrive pas à l'envoyer dans mon EditText, j'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EditText output = (EditText)rootview.findViewById(R.id.output); //EditText de sortie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                System.out.print(mot);
                if ( map.containsKey(mot) ) {
                    output.setText(mot);
                    output.setText(map.get(mot));
                }
                System.out.println();
    Mais cela ne marche pas, la partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    output.setText(map.get(mot));
    est en Cannot resolve method 'setText'(java.lang.Object)', et si je commente cette partie, la partie me ressort seulement le dernier groupe de trois (dans la chaine : AAAAACAAG, je n'ai que AAG en sortie)

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par gisclace Voir le message
    (à noter que j'ai modifié les chaineADecouper.length en chaineADecouper.length(), sinon ça ne passait pas )
    Faute de frappe de ma part. Désolé.

    Citation Envoyé par gisclace Voir le message
    Par contre, je n'arrive pas à l'envoyer dans mon EditText, j'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EditText output = (EditText)rootview.findViewById(R.id.output); //EditText de sortie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                System.out.print(mot);
                if ( map.containsKey(mot) ) {
                    output.setText(mot);
                    output.setText(map.get(mot));
                }
                System.out.println();
    Mais cela ne marche pas, la partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    output.setText(map.get(mot));
    est en Cannot resolve method 'setText'(java.lang.Object)', et si je commente cette partie, la partie me ressort seulement le dernier groupe de trois (dans la chaine : AAAAACAAG, je n'ai que AAG en sortie)
    Une Map stocke tout typé en Object, donc il faudrait caster pour récupérer les mots typés en String.

    Mais, tu peux tout simplement, paramètrer la HashMap :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HashMap<String, String> map = new HashMap<>();
    Ainsi, map.get(mot) n'a plus besoin d'être casté en String.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 83
    Par défaut
    Arf, en plus je l'utilise dans une autre activité...
    Un grand merci à toi !!!

    Autre question au passage (mais toujours sur le même sujet). Le traitement de la chaine doit commencer à partir du groupe "ATG", problème, la chaine commence rarement par ce groupe, comment faire donc pour commencer uniquement à partir du moment on on trouve ATG ?

    Exemple :
    chaine : AAAACGAGCATGAAAACGAGC
    Chaine à traiter : ATGAAAACGAGC
    ATG M
    AAA K
    ACG N
    GAC K

    Encore merci.

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    string.indexOf("ATG") te donnera la position du premier "ATG" dans la chaîne string.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Pour ça il faut utiliser indexof()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    string chaine = "0123Test89";
    string test = "Test";
    chaine.indexOf(test); // retourne 4
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Découper une chaîne de caractères
    Par gege2061 dans le forum Langage
    Réponses: 9
    Dernier message: 07/03/2008, 19h59
  2. [VBA-E] découper une chaîne de caractère
    Par jagwar dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/07/2006, 14h07
  3. Découper une chaîne
    Par Anonn dans le forum C
    Réponses: 5
    Dernier message: 30/06/2006, 13h51
  4. Comment découper une chaîne de caractères en VBA
    Par TomPad dans le forum Access
    Réponses: 3
    Dernier message: 23/06/2005, 09h58
  5. Découper une chaîne de la droite
    Par Gourouni dans le forum ASP
    Réponses: 4
    Dernier message: 10/03/2005, 11h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo