首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >.replace()函数无法正确交换字符

.replace()函数无法正确交换字符
EN

Stack Overflow用户
提问于 2019-03-21 21:03:00
回答 2查看 77关注 0票数 0

我正在编写一个函数,用于将特定字符替换为其他字符

代码语言:javascript
运行
复制
public static String makeComplement(String dna) {
    if(dna.contains("A")|| (dna.contains("T") ||(dna.contains("G") ||(dna.contains("C") ) )) ){
        dna = dna.replace('A' , 'T');
        dna = dna.replace('T' , 'A');
        dna = dna.replace('G' , 'C');
        dna = dna.replace('C' , 'G');

        System.out.println(dna);
    }
    return dna;
}

public static void main(String[] args) {
    String ex ="GTACTCC";
    System.out.println(ex);

    makeComplement(ex);
}

它取代了A中的T和G中的C,但A和G保持不变。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-21 21:05:43

当然是这样的。

代码语言:javascript
运行
复制
dna = dna.replace('A' , 'T'); // replaces As with Ts
dna = dna.replace('T' , 'A'); // replace Ts with As (including the As that 
                              // were replaced with Ts)
dna = dna.replace('G' , 'C'); // replaces Gs with Cs
dna = dna.replace('C' , 'G'); // replace Cs with Gs (including the Gs that 
                              // were replaced with Cs)

如果你想用Ts替换As,用c替换Gs,你可能应该使用一些中间字母:

代码语言:javascript
运行
复制
dna = dna.replace('A' , 'X');
dna = dna.replace('T' , 'A'); // only original Ts will become As 
dna = dna.replace('X' , 'T');
dna = dna.replace('G' , 'Y');
dna = dna.replace('C' , 'G'); // only original Cs will become Gs
dna = dna.replace('Y' , 'C');

编辑:正如Mike评论的那样,您可以在没有replace方法的情况下更有效地完成此替换:

代码语言:javascript
运行
复制
StringBuilder sb = new StringBuilder (dna.length());
for (char c : dna.toCharArray()) {
    if (c == 'A')
        sb.append('T');
    else if (c == 'T')
        sb.append('A');
    else if (c == 'G')
        sb.append('C');
    else if (c == 'C')
        sb.append('G');
} 
dna = sb.toString();
票数 2
EN

Stack Overflow用户

发布于 2019-03-21 21:29:57

调用String.contains和/或String.replace可能会扫描整个字符串,因此对于非常长的字符串,多次调用它可能会耗费大量资源。

为什么不在一次传递中完成所有替换:

代码语言:javascript
运行
复制
// Copy the original DNA string to a new mutable char array
char[] dnaCopy = dna.toCharArray();

// Examine each character of array one time only and replace
// as necessary
for(int i = 0; i < dnaCopy.length; i++) {
  if(dnaCopy[i] == 'A') {
     dnaCopy[i] = 'T';
  }
  else if(dnaCopy[i] == 'T') {
     dnaCopy[i] = 'A';
  }
  else if(dnaCopy[i] == 'G') {
     dnaCopy[i] = 'C';
  }
  else if(dnaCopy[i] == 'C') {
     dnaCopy[i] = 'G';
  }
}

// Now you can do whatever you want with dnaCopy: make a new String, etc

这种方法对于长字符串应该更有性能,并且可能使用分而治之的方法进行扩展(即,您可以让两个线程同时在阵列的一半上工作)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55281068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档