2016-12-01 20 views
2

我想創建的使用4個字母的所有可能的兩個字母的單詞的列表 - A,C,T,G。所以輸出應該像如何在java中動態檢查條件?

兩個字母的單詞輸出

AA 
CA 
TA 
GA 
AC 
CC 
TC 
GC 
AT 
CT 
TT 
GT 
AG 
CG 
TG 
GG 

我能夠生產使用這種Java代碼

兩個字母的單詞Java代碼

import java.io.IOException; 

class Variations { 

    private static char replace (char bc) { 
     switch (bc) { 
      case 'A': 
       bc = 'C'; 
       break; 

      case 'C': 
       bc = 'T'; 
       break; 

      case 'T': 
       bc = 'G'; 
       break; 

      case 'G': 
       bc = 'A'; 
       break; 
     } 

     return bc; 
    } 

    public static void main(final String[] args) throws IOException { 

     String code = "AA"; 
     char[] bc = new char[code.length()]; 

     for (int i=0; i<code.length(); i++) { 
      bc[i] = code.charAt(i); 
     } 


     for (int i=0; i < Math.pow(4, bc.length); i++) { 

      System.out.println(bc); 

      bc[0] = replace(bc[0]); 

      if (i%4 == 0) { 
       bc[1] = replace(bc[1]); 
      } 


     } 

    } 
} 
上面的輸出

現在我想創建使用相同的4個字母的所有可能的三個字母的單詞的列表 - A,C,T,G。所以輸出會像

三個字母的單詞輸出

AAA 
CAA 
TAA 
GAA 
ACA 
CCA 
TCA 
GCA 
ATA 
CTA 
TTA 
GTA 
AGA 
CGA 
TGA 
GGA 
AAC 
CAC 
TAC 
GAC 
ACC 
CCC 
TCC 
GCC 
ATC 
CTC 
TTC 
GTC 
AGC 
CGC 
TGC 
GGC 
AAT 
CAT 
TAT 
GAT 
ACT 
CCT 
TCT 
GCT 
ATT 
CTT 
TTT 
GTT 
AGT 
CGT 
TGT 
GGT 
AAG 
CAG 
TAG 
GAG 
ACG 
CCG 
TCG 
GCG 
ATG 
CTG 
TTG 
GTG 
AGG 
CGG 
TGG 
GGG 

所以產生這種上面的輸出,我只需要添加一個更if聲明,我的主要方法,

三個字母的單詞Java代碼

import java.io.IOException; 

class Variations { 

    private static char replace (char bc) { 
     switch (bc) { 
      case 'A': 
       bc = 'C'; 
       break; 

      case 'C': 
       bc = 'T'; 
       break; 

      case 'T': 
       bc = 'G'; 
       break; 

      case 'G': 
       bc = 'A'; 
       break; 
     } 

     return bc; 
    } 

    public static void main(final String[] args) throws IOException { 

     String code = "AAA"; 
     char[] bc = new char[code.length()]; 

     for (int i=0; i<code.length(); i++) { 
      bc[i] = code.charAt(i); 
     } 


     for (int i=0; i < Math.pow(4, bc.length); i++) { 

      System.out.println(bc); 

      bc[0] = replace(bc[0]); 

      if (i%4 == 0) { 
       bc[1] = replace(bc[1]); 
      } 

      if (i%16 == 0) { 
       bc[2] = replace(bc[2]); 
      } 


     } 

    } 
} 

所以我的問題是,如果用戶可以選擇指定他/她是否想要所有雙字母單詞或三字母單詞的列表 - 我該如何將兩個程序結合起來?這兩種方案只因一個條件陳述而異。

用戶可以指定他/她是否需要所有可能的2字母單詞或3字母單詞或甚至4個字母單詞的列表。我的程序必須動態添加或刪除條件語句才能生成列表。是否有可能在Java中做到這一點?

預先感謝您!

+2

您應該重新設計您的算法以獲取參數,'n'指定序列長度。同時要小心'Math.pow'會產生'double's,這可能會導致'2^53'上的舍入錯誤。 – AlexR

+0

您的問題是您當前的代碼使用兩種「不同的方式」解決*相同*問題。 – GhostCat

回答

4

您基本上正在實施笛卡爾產品。谷歌的番石榴中有一種非常好的方法叫做Sets#cartesianProduct

有了這個,你可以很容易地生成所有可能的組合:

Set<List<String>> set = Sets.cartesianProduct(Collections.nCopies(3, ImmutableSet.of("A", "C", "T", "G"))); 

你可以有3爲用戶確定的參數。

現在我們只需要一些Java 8個流「魔術」:

String output = set.stream() 
    .map(list -> list.stream().collect(Collectors.joining())) 
    .collect(Collectors.joining("\n")); 

當然你可以調整的最後一部分,它只是模仿你在你的問題顯示輸出。

+1

優秀! 。 。 。 – GOXR3PLUS

+0

謝謝。奇蹟般有效。解決了我的頭痛:) –

+0

我相當期待這是OP的頭上的方式。但我想你是正確的發佈它。我也學到了一些東西(nCopies),因此我很高興你能發佈它。 – Teto

1

是的。一個好的方法是使用某種代碼向用戶詢問他們想要的長度:2或3.您可以在控制檯中使用掃描儀進行此操作。添加

import java.util.Scanner; 

到您的代碼的頂部。然後,在主要方法的頂部,添加

Scanner scannerName = new Scanner(System.in); 

然後您可以詢問用戶並保存其響應。

System.out.print("Enter the length you would like, AA or AAA: "); 
String code = scannerName.next(); 

然後你就可以改變你要添加的if語句是:

if (i%16 == 0 && code.length() == 3) {your code...} 

這樣,它纔會運行,如果用戶輸入AAA或長度的另一個標記3.

另外,如果你想擴展爲多達四個工作,你可以摺疊這樣的代碼:

for (int count = 2; count <= code.length(); count++){ 
    if (i % (Math.pow(2, count)) == 0){ 
     bc[count] = replace(bc[count]); 
    } 
} 

這應該適用於所有的1,2,3,4等等。