7
votes

Échanger des lettres dans une chaîne

J'ai besoin d'échanger des lettres dans une chaîne avec les règles suivantes:

  • a est remplacé par T
  • t est remplacé par un
  • c est remplacé par g
  • g est remplacé par C

    Par exemple: acgta devrait devenir tgcat

    Quel serait le meilleur moyen de résoudre ce problème?


4 commentaires

Dupliqué possible de Remplacer en tableau


Il existe une représentation plus compacte des chaînes d'ADN qui utilise seulement 2 bits par base. S'il s'agit d'un projet de recherche sérieux, vous pouvez envisager ces options au lieu d'utiliser char par base (surtout si vos chaînes d'ADN peuvent avoir des millions de bases et plus).


Je pensais que Real ADN Decrypt a eu d'autres lettres aussi, utilisées pour représenter des types particuliers d'incertitude. Je me souviens d'être assez surpris quand j'ai découvert, mais ce n'est pas vraiment surprenant lorsque vous considérez comment ils font la séquençage. Il suffit de commencer à obtenir des séquenceurs équivalents numériques appropriés en ligne maintenant AIUI.


Une table Lookup peut être utilisée, étant donné le petit alphabet d'ADN, même avec les codes d'ambiguïté notés par @Donalfellows. C'est cinq ans après la question, mais j'ai ajouté une meilleure réponse ci-dessous.


4 Réponses :


4
votes

Comme i a expliqué hier , les chaînes sont immuables, vous ne pouvez pas changer de Chaîne, vous devez en créer un nouveau et remplacer l'ancien.

Vous pouvez résoudre votre problème comme celui-ci: P>

String s = "ACGTA";
char[] reverse = new char[s.length()];
for (int i = 0; i < reverse.length; i++) {
  switch(s.charAt(i)) {
    case 'A': reverse[i] = 'T';break;
    case 'T': reverse[i] = 'A';break;
    case 'C': reverse[i] = 'G';break;
    case 'G': reverse[i] = 'C';break;
    default: //handle error here -> invalid char in String
  }
}
s = new String(reverse);


8 commentaires

-1: Mais vous pouvez affecter une nouvelle chaîne (c'est-à-dire d'appliquer la transformation sur l'ancienne chaîne) à la variable contenant l'ancienne chaîne. Ne soyez pas excessivement obtus.


ok merci aussi, votre solution hier aidMe, mais j'ai eu un problème avec Remplacer tout, mais travaille maintenant avec Mark Byers Solution


@Donal - J'espère que vous avez eu au moins un coup d'œil à la question référencée et à la réponse avant de vous avoir bullevé. Le noyau de cette réponse est la solution au problème de remplacement. Hier, Mac135 semblait être concentré sur la modification de la chaîne d'origine, alors j'ai eu le sentiment, cela recommencerait.


Si la performance est un problème, il peut être préférable de changer le char [] en place et l'utiliser pour créer votre résultat à la dernière étape.


@Donal Vous pouvez certainement attribuer la nouvelle chaîne à la même variable; Cependant, cela ne change pas le fait que vous créez inutilement des chaînes supplémentaires, StringBuilder est plus efficace.


+1; Mais gardez à l'esprit que les chaînes d'ADN peuvent être incroyablement longues (des millions de char ou plus), alors alors que pour chacun sur .tocharray () est le plus lisible et acceptable dans la plupart des cas, ce n'est peut-être pas dans ce cas (puisqu'il double la condition spatiale).


Si les données sont dans une chaîne , toutes les opérations vont augmenter l'espace requis. S'ils sont dans un StringBuilder , vous n'avez reçu qu'un ensemble restreint d'opérations disponibles. La solution réelle, étant donné que seules des substitutions Char-for-Char sont effectuées, consiste à tout garder dans une matrice de caractère et à effectuer le traitement manuellement (bien, à basculer à l'intérieur de la boucle) afin que vous ne copiez jamais quelque chose ou que vous n'avez jamais de frais généraux stupides.


@Donal - comme indiqué dans ma solution «haute performance» ajoutée déjà.



9
votes

Recherche de Java "A à T, T à un" Code> a trouvé ce Suggestion :

String sequence = "AATTTCTCGGTTTCAAT";
sequence = sequence.replace("A", "t")
                   .replace("T", "a")
                   .replace("C", "g")
                   .replace("G", "c")
                   .toUpperCase();
System.out.println(sequence);


3 commentaires

Pourquoi le remplacement minuscule et ensuite TUPPERCASE?


@ Fourniture: Pour éviter de remplacer le même personnage deux fois (A -> T -> A).


Notez que cette approche simple traverse la chaîne plusieurs fois. Une seule itération est possible et peut augmenter la vitesse. Une seule itération peut également éliminer la nécessité de perdre le boîtier de la lettre originale, ce qui est parfois utilisé pour communiquer des informations.



6
votes

J'irais pour une solution plus générale comme ceci: xxx pré>

appeler la fonction comme ceci donnerait le résultat dont vous avez besoin: p>

echo ACGTA | tr ATCG TAGC


0 commentaires

0
votes

L'ADN a un petit alphabet. Vous pouvez utiliser un Table de recherche , remplacement de quelques instructions avec une indexation de tableau simple.

Cette approche: p>

  • traverse la séquence qu'une seule fois. li>
  • élimine les déclarations conditionnelles. LI>
  • peut être stable en termes de cas de lettre, ce qui est parfois utilisé pour communiquer des informations dans des séquences d'ADN. LI>
  • peut gérer les codes d'ambiguïté IUPAC. LI>
  • peut gérer des lacunes. li>
  • peut facilement fournir un complément inverse em>. li> ul>

    Tout d'abord, vous avez besoin d'une table de recherche. P> xxx pré>

    alors, vous pouvez trouver les bases du complément par une simple recherche de table. P>

    complement(ACGTA) = TGCAT
    reverseComplement(ACGTA) = TACGT
    


0 commentaires