2016-08-29 5 views
1

Ich habe ein wenig Mühe, herauszufinden, einige komplizierte Logik für ein Programm bei der Arbeit erforderlich.Länge eines 2D-Arrays in einer HashMap

Dieses Programm wurde entwickelt, um "Transaktionen" zwischen zwei Ordnern zu vergleichen. Jeder Ordner kann eine beliebige Anzahl von Dateien enthalten und jede Datei (XML-Dokument) kann eine beliebige Anzahl von Transaktionen enthalten. Jede Transaktion hat 5 Tags.

Ich muss zwei Ordner vergleichen und sehen, ob Transaktionen übereinstimmen.

Um dies zu tun, verwende ich eine HashMap und setzen Sie eine String[][] Array innerhalb davon. Jeder Schlüssel in HashMap wird 1 Datei darstellen. Die Zeile im String repräsentiert eine Transaktion und die Spalten repräsentieren die Tags.

Ich habe Probleme herauszufinden, wie auf die String[][] von innerhalb der HashMap zugreifen. Ich muss die Anzahl der Transaktionen (Zeilen) ermitteln.

Hier ist, wie ich die oben tun:

// Creating the HashMap and Array[][] 
public static Map<Integer, String[][]> Pain008TransactionsCollection = new HashMap(); 
public static String[][] Pain008Transactions; 

//Here is the logic where I populate the HashMap. 
int transactionSize = EndToEndId.size(); 

//Creates a 2D array with one dimension for each transaction and six dimensions 
//for relevant tags + filename. 
Pain008Transactions = new String[transactionSize][6]; 

//For each transaction.. 
for(int i = 0; i < transactionSize; i++){ 

    //Below will add each value into the 2D array for each transaction. Note that the 
    //filename is also added so that it can be easily associated with a transaction later. 
    Pain008Transactions[i][0]=EndToEndId.get(i); 
    Pain008Transactions[i][1]=InstdAmt.get(i); 
    Pain008Transactions[i][2]=MmbId.get(i); 
    Pain008Transactions[i][3]=DbtrNm.get(i); 
    Pain008Transactions[i][4]=OthrId.get(i); 
    Pain008Transactions[i][5]=GetFiles.pain008Files.get(currentFile).toString(); 

} 

//Puts the 2D array into the collections map at the position of the current 
//file in sequence. 
Pain008TransactionsCollection.put(currentFile, Pain008Transactions); 

System.out.println(Pain008TransactionsCollection); 

Ich weiß, dass die Gesamtzahl der HashMap Schlüssel des ich diese benutzen Sie:

Pain008TransactionsCollection.size() 

und ich kenne die Zeilen für die bekommen String [] [] ich benutze

Pain008Transactions.length() 

Aber ich bin nicht sicher, wie dieanrufen 0 Schlüssel und dann die Zeilenlänge für diesen bestimmten Schlüssel.

Jede Hilfe würde wirklich geschätzt werden.

+1

Sie sollten hier lieber eine Liste von benutzerdefinierten Objekten anstelle von 2D-Array erstellen. Sie können also eine Klasse mit 6 Feldern definieren, die Sie benötigen, und dann die Liste der Klasseninstanzen in der Liste speichern. Und verwende keine rohen Typen, benutze 'new HashMap <>()' anstelle von 'new HashMap()'. –

+1

Schauen Sie in Java-Code-Stil-Anleitungen. Variablennamen heißen camelCase (also starten sie nie UpperCase). Es ist auch eine schlechte Idee, etwas wie "Sammlung" in einen Variablennamen zu schreiben. Warum nicht "transactionsByIndex" oder so ?! – GhostCat

+0

Und darüber nachdenken: Es klingt wirklich seltsam, dass Ihr Kartenschlüssel ein Integer sein soll? Wahrscheinlich solltest du einen Schritt zurückgehen und versuchen, ** mehr Abstraktionen einzuführen. Zum Beispiel: Eine Klasse, die eine ** Transaktion darstellt **. Diese Klasse kennt die 5 Attribute; und hat Methoden, um zum Beispiel zwei Transaktionen zu vergleichen. Also: weg von Low-Level-2-dim-String-Arrays. Sonst verbringst du viel Zeit mit dem Schreiben von sehr viel Array-Manipulations-Code auf niedriger Ebene. Sobald der Editor geschlossen wird, wird dies zu einem Albtraum. – GhostCat

Antwort

1

Sie Iterierte die Karte, wie

for (Entry<Integer, String[][]> entry : Pain008TransactionsCollection.entrySet()) { 
    Integer key = entry.getKey(); 
    String[][] data = entry.getValue(); 
} 

Thats it. Oder vermisse ich etwas?

Sie rufen einen einzelnen Wert und seine Dimensionen mit:

String data[][] data = Pain008TransactionsCollection.get(0); 
int rowCount = data.length; 
int columnCount = data[0].length; 

zum Beispiel.

+0

Das scheint wie es mehr als nötig sein könnte. Ich weiß, dass ich einfach einen Wert aufrufen muss, den ich kann: ClearedMainGUI.Transactions.get (ClearedMainGUI.selectedRow) [i] [7] = tbl.getValueAt (i, 7) .toString(); Das Problem besteht jedoch darin, nur die tatsächliche Länge der Zeilen für ein bestimmtes HashMap-Array zu ermitteln. Was ist damit: ParseACH.ACHTransactionsCollection.get (i) .length; j ++ – jesric1029

+0

Vielen Dank für den Nachweis meines Kommentars: der Code, den Sie gerade gepostet haben, ist übermäßig ** Low-Level **. Und wenn du denkst, dass meine Sachen "zu raffiniert" sind; dann würde ich sagen: Sie bekommen es völlig falsch. Je "ausgeklügelter" (aka reich an Abstraktion) Ihr Code ist, desto besser. Und ehrlich gesagt: Lesen Sie Ihre Aussagen; Ich beginne zu bezweifeln, dass Sie eine gute Vorstellung davon haben, was gebraucht wird. Es scheint, dass Sie 10% Java-Kenntnisse haben - und was auch immer nicht in dieses kleine Gebiet passt ... Sie lehnen ab. Und ehrlich gesagt: Das ist keine gute Strategie, um Programmierprobleme zu lösen. – GhostCat

+0

Mit anderen Worten: Sie haben gefragt, wie Sie auf KEYS und VALUES Ihrer Map zugreifen können. Ich habe es dir gesagt. Also, wenn das ** nicht ** ist, wonach du gefragt hast - was ist dann deine Frage? Das Problem, das du lösen willst? – GhostCat

Verwandte Themen