如何从列表中取出每三个字母并将其保存为数组?

时间:2015-02-05 06:56:23

标签: java arrays string for-loop methods

我怎么能将这个字符串的每三个字母:ATGCCACTATGGTAG保存在一个数组中,每三个字母用逗号分隔。 这就是我所拥有的: 参数序列是上面的混乱字母。

public static void listCodons(String sequence){
      int length = sequence.length();
      String[] listOfCodons = new String[length]; 
      for(int i = 0; i< length; i++){
            //This is where I'm not sure what to do
            listOfCodons = sequence[i]+sequence[i+1]+sequence[i+2]; 
         } 
      }
      System.out.print(Arrays.toString(listOfCodons));
}

5 个答案:

答案 0 :(得分:1)

首先,这是语法错误的代码,有很多错误。第一个是for循环后的两个},第二个是方法的引爆结束,因此System.out.print之后的listCodons方法超出了[index]方法的范围,因此它是一个错误。

第二个错误是在java中,无法使用.charAt(index)访问字符串中的字符,而是必须使用ATGCCACTATGGTAG

如果我正确理解您的问题,您希望参数["ATG", "CCA", "CTA", "TGG", "TAG"]成为public static void listCodons(String sequence) { int length = sequence.length(); String[] listOfCodons = new String[length / 3]; for (int i = 0; i < listOfCodons.length; i++) { listOfCodons[i] = sequence.substring(i * 3, i * 3 + 3); } System.out.print(Arrays.toString(listOfCodons)); } 的数组。如果是这种情况,这是解决方案,有固定的问题:

i * 3

使用1/3长度的刺,因为我们一次需要3个字符。 i * 3 + 3是字符串时间3的当前位置,以便更正标记的开头,{{1}}是从此位置接下来的3个字符。这里唯一的问题是标签长度是否一致,但没有相关信息。

答案 1 :(得分:0)

根据@shikjohari answer on SO发布的链接,你可以像

一样解决它
public class Split {

    public static void listCodons(String sequence) {
        String[] listOfCodons = sequence.split("(?<=\\G...)");
        System.out.print(Arrays.toString(listOfCodons));
    }

    public static void main(String[] args) throws Exception {
        listCodons("ATGCCACTATGGTAG");
    }
}

从上述链接复制的说明:正则表达式(?&lt; = \ G ...)匹配一个空字符串,该字符串包含最后一个匹配(\ G),后跟三个字符(...)之前((?&lt; =))。

答案 2 :(得分:0)

使用Guava Libraries

的方式更加智能,更易于阅读

代码:

public static void listCodons(String sequence)
{
    Iterable<String> pieces = Splitter.fixedLength(3).split(sequence);

    // note this is Java 8 Lambda Syntax
    pieces.forEach(pi -> System.out.println(pi));

    // If you can not use Java 8 take the following:
    for (String piece : pieces)
    {
        System.out.println(piece);
    }
}

答案 3 :(得分:0)

假设序列的长度为9,并且您希望对每三个字符进行分组。 这为您提供了以下分组:

  • 字符0,1和2;
  • 字符3,4和5;
  • 字符6,7和8.

注意每个组中的第一个字符是如何以3的倍数编制索引的。 您可以在代码中使用此提示。

public static void listCodons(String sequence){
      /** If your sequence has n characters, then
      /*  dividing it into groups of three results in
      /*  n/3 groups. */
      int length = sequence.length();
      String[] listOfCodons = new String[length/3];

      for(int i = 0; i< length/3; i++) {
          /** Remember: the first character of each codon
          /*  is indexed in the sequence by a multiple
          /*  of three. */
          listOfCodons[i] = sequence.substring(3*i, 3*(i+1));
      }
      System.out.print(Arrays.toString(listOfCodons));
}

那是怎么回事? 让我们使用您的原始示例ATGCCACTATGGTAG。 序列的长度为15。 因此,我们最终会得到15/3 = 5个密码子。 每个密码子i将由3*i3*i+13*i+2索引的字符组成。 所以你取相应的子串并将其添加到密码子列表中。

希望这有帮助。

答案 4 :(得分:0)

Try this code :

public static void listCodons(String sequence){
        int length = (sequence.length()/3);
        String[] listOfCodons = new String[length]; 
        int j=0,i=0;
        while(i<sequence.length() && j<listOfCodons.length){
            listOfCodons[j++]=sequence.substring(i, i+3);
            i+=3;
        }
        System.out.println(Arrays.toString(listOfCodons));
    }