java

2015-04-21 32 views
5
yapılandırılmış verileri karşılaştırarak

Iki ortak veri yapıları kullanan bir java programı başarıyla uyguladım: bir kullanıcı bir ağaç düğümü KIMLIğI girip bir ağaç düğüm KIMLIĞI girmesine ve ilgili bilgi almak için bir arabirim ile birlikte bir ve bir Stack ebeveynine. Burada bu programın son sürümü bakabilirsiniz at my GitHub src for this programjava

Arkaplan

Ben oluşan bir dosyadaki verileri karşılaştırarak organizmaların genelinde yüzlerce gen akışının evrimini incelemek için kullanılır yazdığı bu ad hoc programı of: FeatureIDs = String ilkel (bunlar aşağı doğru ilk sütunda "ATM-0000011", "ATM-0000012", vb. olarak listelenir) ve ağaçtaki belirli bir düğümdeki varlık veya yokluğu ile ilişkili puanlardan oluşur ve bunlar double ilkel. İşte

veri dosyası göründüğünü gibi:

"FeatureID","112","115","120","119","124",...//this line has all tree node IDs 
"ATM-0000011",2.213e-03,1.249e-03,7.8e-04,9.32e-04,1.472e-03,... //scores on these lines 
"ATM-0000012",2.213e-03,1.249e-03,7.8e-04,9.32e-04,1.472e-03,...//correspond to node ID 
"ATM-0000013",0.94,1.249e-03,7.8e-04,9.32e-04,1.472e-03,...//order in the first line 
... //~30000 lines later 
"ATM-0036186",0.94,0.96,0.97,0.95,0.95,... 

Sorun

Daha önce, dizi (sadece veri dosyasından çiftlerde bir 2D dizi yapmak için yeterli iyiydi dosyadaki ilk satırı ve FeatureID'lerini, Dizeler olduğu için hariç tutuyor) ve 2B dizisini kullanarak double yığınlarını oluşturuyor. Yığınlar, kullanıcı girişi ve Tree tarafından belirlenen ana ve çocuk düğümleri için yapılacaktır.

Ebeveyn ve çocuk yığınlarındaki veriler aynı anda atılır (böylece, bu özelliklerin DS'ye bu verileri dahil etmeden aynı FeatureID'lerin karşılaştırıldığından emin olun) ve bunların değerlerine göre değerleri karşılaştırılır. tanımlı bir koşulla karşılaştılar (örneğin, eğer her iki değer de> = 0.75). Yaptılarsa, bir sayaç artırılacaktı. Karşılaştırmalar bittiğinde (yığınlar boştu) program sayımı/sayıları döndürürdü.

Şimdi onun yerine sadece sayma ne yapmak istediğini, FeatureIDs karşılaştırma kriterine uygun olan bir liste (ler) yapmaktır. Yani, ölçütleri karşılayan düğüm A ve düğüm B arasında 4100 FeatureIDs olduğunu söyleyen sayacı döndürmek yerine, düğüm A ve düğüm B arasında karşılaştırılan ölçütleri karşılayan tüm 4100 FeatureID Strings listesini istiyorum. Bu listeyi daha sonra bir dosya olarak kaydedin ama bu endişe verici değil. Bu, daha önce çok iyi çalışmış olan double 2B dizi/double yığın şemasını muhtemelen terk etmem gerektiği anlamına gelir.

Soru sorunun ne olduğunu bilerek, ya da bir yerde benim kod (tlacMain.java) içinde olmadan giriş veri dosyada değişiklik yapabilir bu soruna bir akıllı düzeltme var sürece daha fazla veri eklemek? Sadece fikirlere ihtiyacım var. Sorunuzu doğru anlamak eğer

+0

Özellik kimliklerini sayıyorsunuz, neden bunları ArrayList gibi bir Liste yapısına eklemiyorsunuz? –

+0

(bu aynı zamanda @ felixbr için de geçerlidir), bu yaklaşımdaki problem, karşılaştırmalar için kullanılan yöntemlerin bir FeatureID bilgisi içermeyen tipi bir üst ve alt yığınını almasıdır. Github'daki kodumdaki uygulamaya bakın https://github.com/asobin/sobin/blob/master/PhyloTLaC/src/tlacMain.java#L253 –

cevap

2

Pek emin değilim, ama bunun yerine bir sayıcı ait sadece bir ArrayList anda karşılaştırıldığında FEATUREID ekleyebilir ve daha sonra bir dosyaya yazarlar.

her karşılaştırma için bir listesi gerekiyorsa HashMap<Comparison, ArrayList<String>> gibi bir şey olabilir.

düzenlemek

: Ben sizin yorumunuzu ve çok fazla değiştirmeden bir çözüm ile gelip çalıştı:

 String[] firstLine = sc.nextLine().split(regex); 
     //line is the line of input being read in thru the inputFile 
     int line = 0; 
     //array of doubles will hold the data to be put in the stacks 
     double [][] theData = new double [28420][firstLine.length]; 
     while(sc.hasNext()) 
     { 
      String lineIn = sc.nextLine(); 
      String[] lineInAsString = lineIn.split(regex); 
      for(int i = 1; i < lineInAsString.length; i++) 
      { 
       theData[line][i] = Double.parseDouble(lineInAsString[i]); 
      } 
      line++; 
     } 

     sc.close(); 

     return theData; 

sizin getFile() fonksiyonu bu bölümünde, bir çift matris içine csv okundu. Matristeki her bir sütun i için ilgili özellik ID'ye de ihtiyacımız var. Hem çift matris hem de özellik ID'si olan bir liste döndürmek için bir kapsayıcı sınıfına ihtiyacınız vardır.

class DataContainer { 
    public double[][] matrix; 
    public int[] featureIds; 

    public DataContainer(double[][] matrix, int[] featureIds) { 
     this.matrix = matrix; 
     this.featureIds = featureIds; 
    } 
} 

Artık her ikisini de döndürmek için yukarıdaki kodu değiştirebiliriz.

String[] firstLine = sc.nextLine().split(regex); 
    // array of ids 
    int[] featureIds = new int[firstLine.length]; 

    for(int i = 1; i < lineInAsString.length; i++) 
    { 
     featureIds[i] = Integer.parseInt(firstLine[i]); 
    } 

    // ... same stuff as before 

    return new DataContainer(newMatrix, featureIds); 

Ana işlevinizde artık iki yapıyı da çıkarabilirsiniz. Bunun yerine

double newMatrix[][] = getFile(args); 

size

DataContainer data = getFile(args); 
double[][] newMatrix = data.matrix; 
int[] featureIds = data.featureIds; 

Artık hesaplamalarda matriksiniz sütunlu o kadar maç için featureIds dizi kullanabilirsiniz yazabilirsiniz. int'u addedInternal içine artırmak yerine, her eşleşme için bir ArrayList<Integer> ve add(id) oluşturabilirsiniz. Ardından, ArrayList'u döndürün, böylece bu işlevin dışında raporlama yapmak için kullanabilirsiniz.

ArrayList<Integer> addedFeatureIds = addedInternal(parentStackOne, childStackOne, featureIdStack);