package train; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.Map; public class Day4 { static int k=21; public static ArrayList<Map.Entry<String, Integer>> sortHash(HashMap<String, Integer> map){ ArrayList<Map.Entry<String, Integer>> mapValuesList = new ArrayList<Map.Entry<String, Integer>>(map.entrySet()); Collections.sort(mapValuesList, new Comparator<Map.Entry<String, Integer>>() { @Override public int compare(Map.Entry<String, Integer> entry1, Map.Entry<String, Integer> entry2) { return ((Integer) entry2.getValue()).compareTo((Integer) entry1.getValue()); } }); return mapValuesList; } public static String searchfor(HashMap<String, Integer> map, ArrayList<String> fin, String kstr){ String tempk2=kstr.substring(1,k); String[] acgt={"A","C","G","T"}; int maxcov=0; String maxbp=""; for(String a : acgt){ if(map.get(tempk2+a)!=null && map.get(tempk2+a)>maxcov){ maxbp=a; maxcov=map.get(tempk2+a); } } if(maxcov>0 && !fin.contains(tempk2+maxbp)){ fin.add(tempk2+maxbp); return maxbp+searchfor(map, fin, tempk2+maxbp); } return ""; } public static String searchback(HashMap<String, Integer> map, ArrayList<String> fin, String kstr){ String tempk2=kstr.substring(0,k-1); String[] acgt={"A","C","G","T"}; int maxcov=0; String maxbp=""; for(String a : acgt){ if(map.get(a+tempk2)!=null && map.get(a+tempk2)>maxcov){ maxbp=a; maxcov=map.get(a+tempk2); } } if(maxcov>0 && !fin.contains(maxbp+tempk2) ){ fin.add(maxbp+tempk2); return searchback(map, fin, maxbp+tempk2)+maxbp; } return ""; } public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ HashMap<String, Integer> map = new HashMap<String, Integer>(); File file = new File("C:\\Users\\asakawa\\Desktop\\SRR987657.fastq"); BufferedReader br; int n=0; try { br = new BufferedReader(new FileReader(file)); String str = br.readLine(); while(str != null){ n++; if(n%4==2){ for(int i=0;i<=str.length()-k;i++){ String tempk=str.substring(i, i+k); if(map.get(tempk)==null){ map.put(tempk, 1); }else{ map.put(tempk, map.get(tempk)+1); } } } if(n%400000==0){ System.out.println(n/4+"リード読み込み完了"); } str = br.readLine(); } br.close(); System.out.println(n/4+"リード読み込み完了"); ArrayList<Map.Entry<String, Integer>> sortedlist=sortHash(map); ArrayList<String> fin=new ArrayList<String>(); for(int i=0;i<sortedlist.size();i++){ String tempk=sortedlist.get(i).getKey(); if(!fin.contains(tempk)){ fin.add(tempk); String tempstr = searchback(map,fin,tempk)+tempk+searchfor(map,fin,tempk); if(tempstr.length()>1000){ System.out.println(">"+sortedlist.get(i).toString()+"_"+tempstr.length()); System.out.println(tempstr); } } } } catch (Exception e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } } }
さらに工夫すべき点としては、伸長するときに相補鎖を調べるとか、分岐しているような箇所は伸長せずに止めるとか、一定の出現頻度以下のk-merは無視するとか、色々と必要。