详细分析一下,最好能仔细说出每步是干嘛的

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();
            }
        }
    }
}

//找出基因
//是否有基因存在判断标志
//基因存在判断
//如果找不到或超出字符串范围结束判断
.....
不都有注释吗

注释很全了啊!