【问题标题】:Comparing char to string index in java vs python比较 char 与 java 与 python 中的字符串索引
【发布时间】:2017-02-03 07:48:10
【问题描述】:

我意识到有很多答案可以简单地解决如何在 Java 中执行此操作,但我正在寻找一种在概念上类似于我可能在 Python 程序中执行的实现的解决方案,因为那是对我来说更熟悉。

我的 Java 函数 cgRatio 接受一个 DNA 字符串并遍历每个索引以计算字符串中“C”和“G”字符值的出现次数,并返回相对于字符串长度的比率。例如,如果我将以下字符串作为函数的参数传递: "ATGGCGCATTAA" 我会得到 5/12 的返回值或 4.1666... 的浮点数

在 Python 中,这个函数可以这样写:

def cgRatio(dna):
count = 0
for i in range(len(dna)):
    if dna[i] == "C" or dna[i] == "G":
        count += 1
return 1.0 * count/len(dna)

一个简单的print cgRatio("ATGGCGCATTAA") 将产生所需的结果。

我见过一些解决方案,例如采用 dna.charAt(i) 并将其转换回字符串或在函数开头实例化新的 char 对象以进行比较。对于如此简单的任务,这似乎过于复杂。 Python 在这项任务中是否更胜一筹,还是在 Java 中有更有效的方法来解决这个问题?

【问题讨论】:

  • 为什么要将它转换回字符串?
  • 我想将索引处的字符串与字符进行比较。 Python 不在乎,但 Java 不会让我只使用 dna[index] == "C"。它的 Java 实现看起来像 dna.charAt(index) == ___ 但我不能使用“C”,因为它将它作为字符串读取。
  • 不,Java 需要 dna[index].equals("C")
  • @ASwiftPeregrine 比较 dna.charAt(index)'C' 而不是 "C"?为什么要使用字符串文字而不是字符文字?
  • 顺便说一句,更好的方法是def cgRatio(dna): return float(dna.count('C') + dna.count('G')) / len(dna)

标签: java python string char dna-sequence


【解决方案1】:

简单的java代码是:

for (int i = 0; i < dna.length(); i++) {
  char c = dna.charAt(i);        
  if (c == 'C' || c == 'G') { 
    count++;
  }
}
return (double)count / dna.length();

绝对没有理由将字符转换为“字符串”来比较它们!

如果您正在寻找“更少”的代码解决方案,您可以使用“for each”样式:

for (char c : dna.toCharArray()) {

易于理解,易于阅读,但代价是创建 new char array

【讨论】:

  • 或者更短以获得与 Phyton 中相同的行数:if (dna.charAt(i) == 'C' || dna.charAt(i) == 'G')。所以Python并不优于Java。
  • @Sayse 我知道,但我不喜欢上级。
  • 另一个警告:dna.length() 的调用次数与字符串长度 + 1 一样多。Python 也不会这样做。如果您的字符串是千兆字节长,请将其提取到一个变量中。
  • @MarkJeronimus - 不一定。由于String 是内置类型,JIT 编译器可能知道String 是不可变的,并且可以提升length() 调用。
  • 感谢大家的意见。令人惊讶的是,我能从这样的轻松讨论中学到很多东西。
猜你喜欢
  • 1970-01-01
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 2012-05-03
  • 1970-01-01
  • 1970-01-01
  • 2015-03-18
相关资源
最近更新 更多