交换字符串中的字母

Mac*_*135 6 java

我需要用以下规则交换字符串中的字母:

  • A由T代替
  • T由A代替
  • C由G代替
  • G由C代替

例如:ACGTA应该成为TGCAT

解决这个问题的最佳方法是什么?

Mar*_*ers 9

正在寻找java "A to T, T to A"找到这个建议:

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

这是一个简单而简洁的解决方案,适用于您的特定情况,如果您的DNA字符串相对较短,将具有可接受的性能.对于处理大量数据的更通用的解决方案,您应该逐个迭代字符并构建新字符串.或者作为多基因润滑剂指出 - 考虑一种存储格式,每个基数仅使用2位而不是16位.

  • @fielding:避免两次替换相同的字符(A - > T - > A). (4认同)

小智 6

我会寻求一个更通用的解决方案:

public String tr(String original, String trFrom, String trTo) {
  StringBuilder sb = new StringBuilder();

  for (int i = 0; i < original.length(); ++i) {
    int charIndex = trFrom.indexOf(original.charAt(i));
    if (charIndex >= 0) {
      sb.append(trTo.charAt(charIndex));
    } else {
      sb.append(original.charAt(i));
    }
  }

  return sb.toString(); 
}
Run Code Online (Sandbox Code Playgroud)

调用这样的函数会得到你需要的结果:

tr("ACGTA", "ATCG", "TAGC")
Run Code Online (Sandbox Code Playgroud)

所以该函数与unix tr实用程序几乎相同:

echo ACGTA | tr ATCG TAGC
Run Code Online (Sandbox Code Playgroud)


And*_*s_D 4

就像我昨天解释的那样,字符串是不可变的,您无法更改字符串,您必须创建一个新字符串并替换旧字符串。

您可以这样解决您的问题:

String s = "ACGTA";
StringBuilder sb= new StringBuilder();
for (char c:s.toCharArray()) {
  switch(c) {
    case 'A': sb.append('T');break;
    case 'T': sb.append('A');break;
    case 'C': sb.append('G');break;
    case 'G': sb.append('C');break;
    default: //handle error here -> invalid char in String
  }
}
s = sb.toString();
Run Code Online (Sandbox Code Playgroud)

该解决方案的优点是您不必创建太多的 String 对象(每个“替换”操作都会创建一个新的 String,如果您必须恢复大量DNA 序列,这可能会降低性能)


这是基于来自Polygenelubricantsrsp的非常有用的评论的更高性能版本:

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);
Run Code Online (Sandbox Code Playgroud)

  • +1;但请记住,DNA 字符串可能非常长(数百万个“char”或更多),因此虽然“.toCharArray()”上的“for-each”在大多数情况下最具可读性和可接受性,但它可能不适合这种情况(因为它使空间需求加倍)。 (3认同)