我有一个任务,我要发现' 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}