2015-03-08 4 views
0

У меня есть набор части данных хеш-таблицы следующим образом:создать HashMap динамически на основе «шаблона» HashMap с чистым кодом

static { 
     A_map.put(KEY_1, value0); 
     A_map.put(KEY_2, value1); 
     A_map.put(KEY_3, value2); 
     A_map.put(KEY_4, value3); 
     ... 
     A_map.put(KEY_N, valueN); 

     B_map.put(KEY_1, Xvalue0); 
     B_map.put(KEY_2, Xvalue1); 
     B_map.put(KEY_3, Xvalue2); 
     B_map.put(KEY_4, Xvalue3); 
     ... 
     B_map.put(KEY_N, XvalueN); 


     C_map.put(KEY_1, Yvalue0); 
     C_map.put(KEY_2, Yvalue1); 
     C_map.put(KEY_3, Yvalue2); 
     C_map.put(KEY_4, Yvalue3); 
     ... 
     C_map.put(KEY_N, YvalueN); 

    ....etc 
} 

Т.е. ключи одинаковы во всех хэшах, но значения разные для хэш-карты.
И я выбираю, какую хэш-карту использовать во время выполнения, поскольку я помещал эти хэшмапы в качестве значений в другой хэш-файл.

Но я думаю, что это может быть более чистым. Я имею в виду, что ключи одинаковы во всех хэш-картах, и только значения должны быть разными в зависимости от выбранного типа хэшмапа во время выполнения.
Что такое хороший способ разработать это чисто?

+0

Это может быть полезно, если вы более четко описали предполагаемое использование. Предполагая, что все значения имеют одинаковый * тип *: предполагается ли это как-то «2D HashMap»? – Marco13

+0

@ Marco13: Нет. Я тестирую API-интерфейс сервера, и у меня есть определенный набор значений для отправки на сервер для тестирования. Мне нужен был более чистый способ, чем то, что у меня есть, что есть все эти хэш-карты один за другим – Jim

ответ

0

Обычно вы извлекаете этот вид информации в собственный файл, например .ini. Java имеет собственный класс для этой цели, называется Properties.

Если вы пытаетесь интернационализацию приложения (HashMaps с ключами и значения в разных языках) Я предлагаю вам взглянуть на ResourceBundles

Если вы действительно хотите придерживаться кода, вы можете написать все свои значения для каждого ключа в массиве, а затем создать HashMaps автоматически итерация массива

Edit:

String[] keys = {"KEY_1", "KEY_2", "KEY_3"}; 
String[] values = { 
    {"VALUE_1_FOR_KEY_1", "VALUE_2_FOR_KEY_1", "VALUE_3_FOR_KEY_1"}, 
    {"VALUE_1_FOR_KEY_2", "VALUE_2_FOR_KEY_2", "VALUE_3_FOR_KEY_2"}, 
    {"VALUE_1_FOR_KEY_3", "VALUE_2_FOR_KEY_3", "VALUE_3_FOR_KEY_3"}, 
} 

int valueToChoose = 1; 
HashMap<String, String> map = new HashMap<>(); 
for(int i = 0; i < keys.length; i++) { 
    map.put(keys[i], values[i][valueToChoose]; 
} 
+0

Да, я хочу сделать это в коде, так как это касается проверки функции. Но если я перебираю массив, как бы выбрать подходящий массив? – Jim

+0

Я просто добавил пример кода – EyeSpy

+0

Пример кода не работает, но я понял, что вы имеете в виду – Jim

0

Как насчет использования списка вместо HashMap, поскольку ключи являются постоянными и идентичными в каждой таблице.

Вы могли бы сделать что-то вроде этого:

enum Keys { 
    _1(0), _2(1), _3(2), _4(3); 

    private int id = -1; 

    private Keys(int i) { 
     this.id = i; 
    } 

    int index() { 
     return id; 
    } 
} 

static { 
    aList = new ArrayList<String>(Keys.values().length); 
    aList.set(Keys._1.index(), "a1"); 
    aList.set(Keys._2.index(), "a2"); 
    aList.set(Keys._3.index(), "a3"); 
    aList.set(Keys._4.index(), "a4"); 

    bList = new ArrayList<String>(Keys.values().length); 
    bList.set(Keys._1.index(), "b1"); 
    bList.set(Keys._2.index(), "b2"); 
    bList.set(Keys._3.index(), "b3"); 
    bList.set(Keys._4.index(), "b4"); 

} 
+0

Мне тоже нужны ключи. – Jim

+0

Если ключи не изменяются и известны во время компиляции, вы можете добавить их String-представление в перечисление _Keys_ в моем примере, увеличив конструктор. С другой стороны, если ключи определены во время выполнения, то, думаю, ответ @Magnamag - ваш лучший вариант. – Noordsestern

2

Я думаю Google Guava's Table structure подходит для вашего варианта использования как шарм. Table<RowKey, ColumnKey, Value> - отличная замена для такой структуры, как Map<RowKey, Map<ColumnKey, Value>>, которая, случается, является вашим конкретным случаем.

Понятно, что вы можете использовать имя хэша в качестве ключа строки (A, B, C и т. Д. Вашего примера), а ваш фактический ключ в качестве ключа столбца (KEY_1, KEY_2, KEY_3 и т. Д. ваш пример).

Как вы на самом деле имеем дело с хэш-таблицы, я предлагаю вам использовать HashBasedTable:

Table<String, String, String> table = 
    HashBasedTable.create(M, N); // M maps, N keys per map 

table.put(A, KEY_1, value0); 
table.put(A, KEY_2, value1); 
table.put(A, KEY_3, value2); 
table.put(A, KEY_4, value3); 
... 
table.put(A, KEY_N, valueN); 

table.put(B, KEY_1, Xvalue0); 
table.put(B, KEY_2, Xvalue1); 
table.put(B, KEY_3, Xvalue2); 
table.put(B, KEY_4, Xvalue3); 
... 
table.put(B, KEY_N, XvalueN); 

... 
... 

table.put(M, KEY_1, Yvalue0); 
table.put(M, KEY_2, Yvalue1); 
table.put(M, KEY_3, Yvalue2); 
table.put(M, KEY_4, Yvalue3); 
... 
table.put(M, KEY_N, YvalueN); 

Если вам нужно получить все отображения для A, вы можете использовать метод row()Table «s:

Map<String, String> mapA = table.row(A); 

Имейте в виду, что эта структура оптимизирована для строк, а это значит, что для получения данных на основе только для столбцов потребуется некоторая итерация.

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