2016-08-29 3 views
1

У меня возникла небольшая проблема, связанная с сложной логикой, необходимой для работы программы.Длина 2D-массива внутри HashMap

Эта программа предназначена для сравнения «транзакций» между двумя папками. Каждая папка может содержать любое количество файлов, и каждый файл (XML-документ) может содержать любое количество транзакций. Каждая транзакция будет иметь 5 тегов.

Я должен сравнить две папки и посмотреть, соответствуют ли какие-либо транзакции.

Для этого я использую HashMap и помещаю в него массив String[][]. Каждый ключ в HashMap будет представлять 1 файл. Строка в String будет представлять транзакцию, а столбцы будут представлять теги.

У меня возникли проблемы с выяснением способов доступа к String[][] изнутри HashMap. Мне нужно получить количество транзакций (строк).

Вот как я выше:

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

и я знаю, чтобы получить строки для String [] [] Я использую

Pain008Transactions.length() 

Но я не знаю, как назвать HashMap, а затем получить длину строки для этого конкретного ключа.

Любая помощь была бы действительно оценена.

+1

Здесь вам лучше ввести список настраиваемых объектов вместо создания 2D-массива. Таким образом, вы можете определить класс с 6 полями, которые вам нужны, а затем сохранить список экземпляров класса в списке. И не используйте необработанные типы, используйте 'new HashMap <>()' вместо 'new HashMap()'. –

+1

Просмотрите руководства по стилю java-кодирования. Переменные имена идут camelCase (поэтому они никогда не запускают UpperCase). Это также плохая идея поместить что-то вроде «коллекции» в имя переменной. Почему бы не «transactionByIndex» или что-то в этом роде ?! – GhostCat

+0

И подумать об этом: звучит странно **, что ваш ключ карты должен быть целым? Вероятно, вам следует еще шагнуть назад и попытаться ввести ** больше ** абстракций. Например: класс, представляющий ** трансляцию **. Этот класс знает о 5 атрибутах; и имеет методы сравнения двух транзакций, например. Итак: уберитесь от низкоуровневых двухмерных строковых массивов. В противном случае вы потратите ** много времени ** написание ** много ** низкоуровневого массива-манипуляционного кода. Это станет кошмаром для обслуживания в тот момент, когда вы закроете свой редактор. – 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

Кажется, что это может быть более чем необходимо. Я знаю, чтобы просто вызвать значение, которое я могу сделать: ClearedMainGUI.Transactions.get (ClearedMainGUI.selectedRow) [i] [7] = tbl.getValueAt (i, 7) .toString(); Но проблема остается только в получении фактической длины строк для определенного массива HashMap. Что об этом: ParseACH.ACHTransactionsCollection.get (i) .length; j ++ – jesric1029

+0

Спасибо за доказательство моего комментария: код, который вы только что опубликовали, слишком ** низкий уровень **. И если вы думаете, что мои вещи «слишком сложны»; то я бы сказал: вы понимаете это совершенно неправильно. «Более сложный» (он же богатый абстракцией), ваш код, тем лучше. И честно: читайте ваши заявления; Я начинаю сомневаться в том, что у вас есть хорошая идея «что нужно». Кажется, что у вас есть 10% -ное знание Java - и все, что не вписывается в эту небольшую область ... вы отвергаете. И честно: это не хорошая стратегия для решения проблем программирования. – GhostCat

+0

Другими словами: вы спрашивали, как получить доступ к KEYS и VALUES вашей Карты. Я говорил тебе. Итак, если это не ** то, о чем вы просили, - тогда на самом деле ваш вопрос; проблема, которую вы пытаетесь решить? – GhostCat

Смежные вопросы