2016-08-29 19 views
1

職場のプログラムに必要な複雑なロジックを理解するのに少し問題があります。HashMap内の2D配列の長さ

このプログラムは、2つのフォルダ間の「トランザクション」を比較するように設計されています。各フォルダには任意の数のファイルを含めることができ、各ファイル(XMLドキュメント)には任意の数のトランザクションを含めることができます。各トランザクションには5つのタグがあります。

2つのフォルダを比較して、一致するトランザクションがあるかどうかを確認する必要があります。

これを行うには、HashMapを使用し、その内部にString[][]の配列を入れています。 HashMapの各キーは1つのファイルを表します。文字列の行はトランザクションを表し、列はタグを表します。

からString[][]にアクセスする方法を調べるのに問題があります。私はトランザクション(行)の数を取得する必要があります。ここで

私は上記を行う方法です。

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

私はこれを使用HashMap、キーの数の合計を取得することを知っている:

Pain008TransactionsCollection.size() 

を、私はのための行を取得するために知っています文字列[] []私は

Pain008Transactions.length() 

を使用しかし、私はを呼び出す方法を確認していません0キーを押し、その特定のキーの行の長さを取得します。

本当にありがとうございます。

+1

ここに2D配列を作成するのではなく、カスタムオブジェクトのリストを導入する方がよいでしょう。したがって、必要な6つのフィールドを持つクラスを定義し、クラスインスタンスのリストをリストに格納することができます。また、生の型を使わないで 'new HashMap()'の代わりに 'new HashMap <>()'を使ってください。 –

+1

Javaコーディングスタイルのガイドを参照してください。変数名はcamelCaseになります(UpperCaseを起動しないように)。変数名に "collection"のようなものを入れることも悪い考えです。どうして "transactionsByIndex"なんかそんなことないの? – GhostCat

+0

それについて考えてみましょう:本当に**奇妙な**あなたのマップキーは整数になると思う?おそらくあなたはさらに後退し、** more **抽象概念を導入しようとします。たとえば、**遷移**を表すクラスです。そのクラスは5つの属性を知っています。例えば2つのトランザクションを比較するメソッドを持っています。したがって、低レベルの2次元文字列配列から離れてください。そうしないと、**低レベルの配列操作コードをたくさん書いて**たくさんの時間を費やすでしょう。エディタを閉じると、それはメンテナンスの悪夢に変わります。 – GhostCat

答えて

1

あなた反復それ

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

ザッツのようなマップ、。それとも、私は何かが恋しいですか?例えば

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

あなたは、単一の値としてその寸法を取得します。

+0

それは必要以上のものかもしれないようだ。私は単にこれを行うことができる値を呼び出すことがわかります:しかし、問題は、特定のHashMap配列の行の実際の長さを取得するだけです。これについてはどうすればいいですか:ParseACH.ACHTransactionsCollection.get(i).length; j ++ – jesric1029

+0

私のコメントを証明してくれてありがとう:ちょうどあなたが投稿したコードが過度に低レベルです**。私のものが「洗練されていない」と思うならば。私は言う:あなたは完全に間違った方法を得る。あなたのコードは「洗練された」(別名抽象的に豊かである)ほどよいでしょう。正直なところ、あなたの声明を読むこと。私は、あなたが「何が必要なのか」という良い考えがあるのか​​疑問に思う。あなたはJavaの知識が10%あると思われます。その小さな領域に収まらないものは...あなたは拒否します。正直なところ、プログラミングの問題を解決するには良い戦略ではありません。 – GhostCat

+0

つまり、マップのKEYSとVALUESにアクセスする方法を尋ねました。先ほども言いました。だから、それが**あなたが求めたものではない** - 実際にあなたの質問です。あなたが解決しようとしている問題? – GhostCat