2015-04-21 13 views
5

Ich habe erfolgreich ein Java-Programm implementiert, das zwei gemeinsame Datenstrukturen verwendet: a Tree und Stack zusammen mit einer Schnittstelle, die es einem Benutzer ermöglicht, in einem Baum Node-ID einzugeben und Informationen darüber in Bezug zu erhalten zu seinem Elternteil. Sie können hier auf die neueste Version des Programms schauen at my GitHub src for this programVergleichen von strukturierten Daten in Java

Hintergrund

Diese Ad-hoc-Programm, das ich schrieb verwendet wird, um die Entwicklung der Genfluss über Hunderte von Organismen zu untersuchen, indem Daten in einer Datei zu vergleichen, die aus von: FeatureIDs = String Grundelemente (weiter unten sind diese in der ersten Spalte als "ATM-0000011", "ATM-0000012" usw. aufgeführt) und besteht aus den Bewertungen, die mit ihrer Anwesenheit oder Abwesenheit an einem bestimmten Knoten im Baum verknüpft sind, und diese sind double Primitive. Hier

ist, was die Datendatei wie folgt aussieht:

"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,... 

Das Problem

Bisher war es gut genug, um nur eine 2D-Array von Doppel zu machen aus der Datendatei (das Array Die erste Zeile in der Datei und die FeatureIDs wurden ausgeschlossen, da es sich um Strings handelt. Verwenden Sie das 2D-Array, um dann double Stacks zu erstellen. Die Stapel würden für Eltern- und Kindknoten erstellt, wie durch Benutzereingabe und Tree bestimmt.

Die Daten im Eltern- und Kindstapel würden dann zur gleichen Zeit gelöscht werden (wodurch sichergestellt wird, dass dieselben FeatureIDs verglichen werden, ohne diese Daten tatsächlich in den DS aufnehmen zu müssen) und ihre Werte basierend darauf verglichen werden Sie erfüllten eine definierte Bedingung (dh wenn beide Werte> = 0,75 waren). Wenn sie das taten, würde ein Zähler inkrementiert werden. Sobald die Vergleiche beendet waren (die Stapel waren leer), gab das Programm die Anzahl (n) zurück.

Jetzt was ich tun möchte, anstatt nur zu zählen, ist eine Liste (n) zu machen, deren FeatureIDs die Vergleichskriterien erfüllen. Anstatt also den Zähler zurückzugeben, der sagt, dass 4100 FeatureIDs zwischen Knoten A und Knoten B die Kriterien erfüllten, möchte ich eine Liste aller 4100 FeatureID Strings, die die Kriterien erfüllt, die zwischen Knoten A und Knoten B verglichen werden. Ich werde Speichern Sie diese Liste später als Datei, aber das ist hier nicht wichtig. Dies bedeutet, dass ich wahrscheinlich das double 2D-Array/double Stack-Schema aufgeben muss, das vorher so gut funktioniert hat.

Die Frage

Zu wissen, was das Problem ist, gibt es eine clevere Lösung, um dieses Problem, wo ich eine Änderung der Eingabedatendatei machen könnte, oder irgendwo in meinem Code (tlacMain.java), ohne Hinzufügen von viel mehr Daten in den Prozess? Ich brauche nur Ideen.

+0

Wo zählen Sie die Feature-IDs, warum fügen Sie sie nicht zu einer List-Struktur wie einer ArrayList hinzu? –

+0

(Dies gilt auch für @felixbr) das Problem mit diesem Ansatz ist, dass die Methoden für Vergleiche verwendet in einem übergeordneten und untergeordneten Stack des Typs , die nicht die FeatureID Informationen enthält. Siehe Implementierung in meinem Code auf Github https://github.com/asobin/sobin/blob/master/PhyloTLaC/src/tlacMain.java#L253 –

Antwort

2

Ich bin nicht ganz sicher, ob ich Ihre Frage richtig verstehe, aber anstatt einen Zähler zu erhöhen, können Sie einfach die aktuell verglichene FeatureID zu einer ArrayList hinzufügen und diese später in eine Datei schreiben. Wenn Sie für jeden Vergleich eine Liste benötigen, können Sie etwas wie HashMap<Comparison, ArrayList<String>> haben.

edit: ich Ihren Kommentar gelesen und versucht, mit einer Lösung zu kommen, ohne zu viel zu ändern:

 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; 

In diesem Teil Ihrer getFile() Funktion, lesen Sie die csv in eine doppelte Matrix. Für jede Spalte i in der Matrix benötigen wir auch die entsprechende FeatureID. Um sowohl die Doppel-Matrix als auch eine Liste mit Feature-IDs zurückzugeben, benötigen Sie eine Container-Klasse.

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

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

Jetzt können wir den obigen Code ändern, um beide zurückzugeben.

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

In Ihrer Hauptfunktion können Sie nun beide Strukturen extrahieren. Also statt

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

können Sie schreiben

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

Sie können nun die featureIds Array verwenden Sie es mit Ihren Matrixspalten in Ihren Berechnungen übereinstimmen. Anstatt einen int innerhalb addedInternal zu erhöhen, können Sie einen ArrayList<Integer> und add(id) für jedes Spiel erstellen. Geben Sie dann die ArrayList zurück, damit Sie sie für Berichte außerhalb dieser Funktion verwenden können.

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