返回字符串中出现的字符



我有一个任务,我要发现' a ', 'C', 'G'和'T'在字符串中出现的次数,并以以下格式返回:

A:count C:count G:count T:count

我对Java非常陌生,3天前才开始学习Java,我看到文献提到HashMap是最可行和最有效的存储和检索这些数据的方法-因此,我选择了这种方法。我已经成功地创建了条件并存储了数据,但是我在上面提到的数据表示方面遇到了困难。

提前为一些冒犯性的代码道歉,到目前为止我所拥有的是:

public class DNA {
static void characterCount(String dna) {
HashMap<Character, Integer> charCountMap = new HashMap<Character, Integer>();
char[] dnaArray = dna.toCharArray();
charCountMap.put('C', 0);
charCountMap.put('A', 0);
charCountMap.put('G', 0);
charCountMap.put('T', 0);
for (char q : dnaArray) {
if (q == 'A' || q == 'C' || q == 'G' || q == 'T') {
charCountMap.put(q, charCountMap.get(q) + 1);
} else {
continue;
} 
}
System.out.println(charCountMap);
}
public static void main(String[] args) {
characterCount("ACTGSRSSDSGGGHHTYTCCCFDT");
}
}

我将感谢任何输入,建议或路标到相关资源,以进一步学习。

非常感谢您的时间!

获得所需输出的一种方法是这样做:

String output = charCountMap.entrySet()
.stream()
.sorted(Map.Entry.comparingByKey())
.map(entry -> entry.getKey() + ":" + entry.getValue())
.collect(Collectors.joining(" "));
System.out.println(output);

您只需要为该格式添加以下代码,而不是System.out.println(charCountMap);:

for (Entry<Character, Integer> c : charCountMap.entrySet()) {
System.out.print(c.getKey()+ ":" + c.getValue() + " ");
}

你会得到这样的输出

A:1 C:4 T:4 G:4

使用"LinkedHashMap"而不是"HashMap",如果您想要遵循字符顺序。

br

使用String.format生成输出。%d是由传递的Long对象通过自动装箱产生的long原语值的占位符。

String.format( 
"C:%d A:%d G:%d T:%d" , 
map.get( "C" ) , map.get( "A" ) , map.get( "G" ) , map.get( "T" ) 
)
<标题>

详细信息Streams使这个工作更容易。

这是本文代码的修改版本。

split方法返回String对象数组。

将它们转换为大写。如果您知道您的输入已经是大写的,则可以省略此步骤。

然后过滤掉所有不是我们想要的CAGT的字符串。

最后,使用Collector获取每个字母的计数,并将结果存储在新映射中。

String input = "ACTGSRSSDSGGGHHTYTCCCFDT" ;
Map < String , Long > map =
Arrays
.stream( 
input.split("") 
)
.map( String :: toUpperCase )
.filter( s -> "CAGT".contains( s ) )
.collect(
Collectors.groupingBy( 
s -> s , TreeMap :: new , Collectors.counting()
)
)
;  

生成输出。

String output =String.format( "C:%d A:%d G:%d T:%d" , map.get( "C" ) , map.get( "A" ) , map.get( "G" ) , map.get( "T" ) ) ;
System.out.println( output ) ;

查看此代码运行在Ideone.com。

C:4 A:1 G:4 T:4

一个可能的解决方案是使用int数组并将字符A- t映射到索引。数组的大小是从A到t的字符数,索引0映射到A,索引19映射到t

static void characterCount(String dna) {
int[] a = new int[20];
for(char c: dna.toCharArray()){
int i = c-'A';
if (i <= 19) a[i]++;
}
System.out.printf("A:%d C:%d G:%d T:%dn", a[0],a[2],a[6],a[19]);
}

您也可以考虑大小写字符,并决定是否使用"a"与"A"相同或不同

如果相同,您可以将代码更改为

char[] dnaArray = dna.toUpperCase().toCharArray();

您可能还希望使逻辑更稳定,并检查输入字符串是否有效

HashMap<Character, Integer> charCountMap = new HashMap<Character, Integer>();
if (dna == null || dna.isEmpty()) {
return;
}
char[] dnaArray = dna.toUpperCase().toCharArray();

除此之外,您还可以开始计算孔字母表并使用相应字符的int值。

HashMap<Character, Integer> charCountMap = new HashMap<Character, Integer>();
if (dna == null || dna.isEmpty()) {
return;
}
char[] dnaArray = dna.toUpperCase().toCharArray();
for (char q : dnaArray) {
for (int charachter = 'A'; charachter <= 'Z'; ++charachter) {
if (q == charachter) {
charCountMap.put(q, charCountMap.getOrDefault(q, 0) + 1);
break;
}
}
}
System.out.println(charCountMap);

输出:

{A=1, R=1, C=4, S=4, T=4, D=2, F=1, G=4, H=2, Y=1}

编辑

使用TreeMap对映射条目进行排序

TreeMap<Character, Integer> charCountMap = new TreeMap<Character, Integer>();

输出:

{A=1, C=4, D=2, F=1, G=4, H=2, R=1, S=4, T=4, Y=1}

最新更新