import java.util.Date;
import java.util.Scanner;
import javax.swing.*;
public class demo{
//找出基因
public static void main(String[]args){
Scanner input = new Scanner(System.in);
System.out.print("Enter a genome string : ");
String s = input.nextLine();
int index = 0;
int newindex = 0;
boolean flagForFirst = true;//是否有基因存在判断标志
//基因存在判断
while(true){
index = s.indexOf("ATG",newindex);
//如果找不到或超出字符串范围结束判断
if(!(index < s.length() - 2 && index >= 0)){
if(flagForFirst){
System.out.println("no gene is found!");
break;
}
else
break;
}
//将三个字符组合成基因
StringBuilder sb = new StringBuilder();
sb.append(s.charAt(index+3));
sb.append(s.charAt(index+4));
sb.append(s.charAt(index+5));
String stringForGenome = sb.toString();
//是否是结束基因
if(stringForGenome == "TAG" || stringForGenome == "TAA"
|| stringForGenome == "TGA")
break;
else{
while(true){
sb = new StringBuilder();
sb.append(s.charAt(index+3));
sb.append(s.charAt(index+4));
sb.append(s.charAt(index+5));
stringForGenome = sb.toString();
if(stringForGenome.equals("TAG") || stringForGenome.equals("TAA")
|| stringForGenome.equals("TGA"))
break;
else{
System.out.print(stringForGenome);
flagForFirst = false;
}
index = index + 3;//继续判断后三位字符是否是基因
}
}
newindex = index + 3;//从新的基因点出发继续判断
System.out.println();//第一段基因结束,换行
}
}
}
这不就是那个从基因链里面找出基因的题目么
import java.util.Date;
import java.util.Scanner;
import javax.swing.*;
public class demo{
//找出基因
public static void main(String[]args){
Scanner input = new Scanner(System.in);
System.out.print("Enter a genome string : ");
String s = input.nextLine();
int index = 0;
int newindex = 0;
boolean flagForFirst = true;//是否有基因存在判断标志
//基因存在判断
while(true){ //////----一直循环,搜索基因,循环内判断,用break跳出循环
index = s.indexOf("ATG",newindex); //////-----------题目说明,基因是以ATG三个字符开头的,所以用indexOf找出基因链中ATG串所在位置。
//如果找不到或超出字符串范围结束判断
if(!(index < s.length() - 2 && index >= 0)){ //////-----------判断查找ATG串返回的位置,如果不是有效位置,包括index<0或者index小于基因链长度减去2,也就是ATG是字符串的最后三个字符
if(flagForFirst){ /////--------如果之前没有找到过任何一个ATG,说明整个基因链中就没有基因数据,输出no gene is found,并且结束循环
System.out.println("no gene is found!");,
break;
}
else /////--------如果之前有搜索到ATG,说明前面已经输出了有效的基因,这里就不输出内容,直接跳出循环即可
break;
}
//将三个字符组合成基因
StringBuilder sb = new StringBuilder(); /////---以下代码是取得ATG串之后的三个字符,就是基因串了。
sb.append(s.charAt(index+3));
sb.append(s.charAt(index+4));
sb.append(s.charAt(index+5));
String stringForGenome = sb.toString();
//是否是结束基因 ///-----判断基因串内容是否为基因结束串,如果是,则直接结束循环,基因信息已经获取结束
if(stringForGenome == "TAG" || stringForGenome == "TAA"
|| stringForGenome == "TGA")
break;
else{
while(true){ /////////////////---------从ATG后循环获取三个字符,因为每三个字符表示一个基因信息
sb = new StringBuilder();
sb.append(s.charAt(index+3));
sb.append(s.charAt(index+4));
sb.append(s.charAt(index+5));
stringForGenome = sb.toString();
if(stringForGenome.equals("TAG") || stringForGenome.equals("TAA") ////---------检查基因信息是否为结束标志,是则跳出循环。
|| stringForGenome.equals("TGA"))
break;
else{
System.out.print(stringForGenome); //-----不是结束标志则输出基因信息
flagForFirst = false; ////-----并且将是否获得有效基本的标志设置为false
}
index = index + 3;//继续判断后三位字符是否是基因
}
}
newindex = index + 3;//从新的基因点出发继续判断
System.out.println();//第一段基因结束,换行
}
}
}
import java.util.Scanner;
public class demo{
//找出基因
public static void main(String[]args){
//创建一个键盘输入流对象
Scanner input = new Scanner(System.in);
//输出一句提示语,用来提示输入一行字符串
System.out.print("Enter a genome string : ");
//从键盘输入一行字符串
String s = input.nextLine();
int index = 0;
int newindex = 0;
boolean flagForFirst = true;//是否有基因存在判断标志
//用死循环来判断基因存在
while(true){
//判断ATG所在字符串s中的位置
index = s.indexOf("ATG",newindex);
//如果找不到或超出字符串范围结束判断
//如果index大于0,并且index小于字符串s的长度,则说明找到了,!取反的意思是没有找到,就结束当前while循环
if(!(index < s.length() - 2 && index >= 0)){
if(flagForFirst){
System.out.println("no gene is found!");
break;
}
else
break;
}
//将三个字符组合成基因
//定义一个字符缓冲对象用来存储字符串
StringBuilder sb = new StringBuilder();
//下面是做字符串的拼接
sb.append(s.charAt(index+3));
sb.append(s.charAt(index+4));
sb.append(s.charAt(index+5));
//将字符缓冲对象转为字符串
String stringForGenome = sb.toString();
//是否是结束基因
if(stringForGenome == "TAG" || stringForGenome == "TAA"
|| stringForGenome == "TGA")
break;
else{
//用死循环来处理业务
while(true){
//定义一个字符缓冲对象用来存储字符串
sb = new StringBuilder();
//下面是做字符串的拼接
sb.append(s.charAt(index+3));
sb.append(s.charAt(index+4));
sb.append(s.charAt(index+5));
stringForGenome = sb.toString();
if(stringForGenome.equals("TAG") || stringForGenome.equals("TAA")
|| stringForGenome.equals("TGA"))
break;
else{
System.out.print(stringForGenome);
flagForFirst = false;
}
index = index + 3;//继续判断后三位字符是否是基因
}
}
newindex = index + 3;//从新的基因点出发继续判断
System.out.println();//第一段基因结束,换行
}
}
}
正则版本,或许更好理解。工作中也是这种方式,你之前的帖子我没敢贴,因为我的输出和你预期的不一样,现在不浪费了,贴下
package com.example.demo8;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main(String[] args) {
// 定义正则匹配,找出所有ATG开头,若干个基因组序列,TAG或TAA或TGA结尾的匹配字符串
final Pattern compile = Pattern.compile("(ATG)(.*?)(TAG|TAA|TGA)");
String line;
// 从控制台读取一行
final Scanner scanner = new Scanner(System.in);
System.out.println("请输入检查序列:");
while ((line = scanner.nextLine()) != null) {
//将行与正则匹配
final Matcher matcher = compile.matcher(line);
boolean b = matcher.find();
//如果没匹配上继续输入
if (!b) {
System.out.println("no gene is found!");
continue;
}
//处理题中的每一次匹配,题干中会匹配两次
while (b) {
//获取每一次匹配中间部分
String real = matcher.group(2);
//三个一组,剔除3个一组多余的
real = real.substring(0, real.length() - (real.length() % 3));
//输出找到的基因组
System.out.println(String.format("%s", real));
b = matcher.find();
}
}
}
}
//找出基因
//是否有基因存在判断标志
//基因存在判断
//如果找不到或超出字符串范围结束判断
.....
不都有注释吗
注释很全了啊!