преобразование статического массива 2D String в HashMap - PullRequest
5 голосов
/ 09 ноября 2009

Какой самый простой способ преобразовать 2D-массив строк в HashMap?

Например, возьмите это: final String[][] sheetMap = { /* XSD Name, XSL Sheet Name */ {"FileHeader", "FileHeader"}, {"AccountRecord", "AccountRecord"}, {"DriverCardRecord", "DriverCardRecord"}, {"AssetCardRecord", "AssetCardRecord"}, {"SiteCardRecord", "SiteCardRecord"} };

Скорее всего, он будет загружен из файла и будет намного больше.

Ответы [ 6 ]

20 голосов
/ 09 ноября 2009
final Map<String, String> map = new HashMap<String, String>(sheetMap.length);
for (String[] mapping : sheetMap)
{
    map.put(mapping[0], mapping[1]);
}
3 голосов
/ 29 сентября 2017

Как немного более чистая альтернатива торговой марке, ответ:

String[][] arr = // your two dimensional array
Map<String, String> arrMap = Arrays.stream(arr).collect(Collectors.toMap(e -> e[0], e -> e[1]));

// Sanity check!
for (Entry<String, String> e : arrMap.entrySet()) {
    System.out.println(e.getKey() + " : " + e.getValue());
}
3 голосов
/ 09 ноября 2009

Если вы хотите просто инициализировать карту удобным способом, вы можете использовать инициализация двойной скобкой :

Map<String, String > sheetMap = new HashMap<String, String >() {{
   put( "FileHeader", "FileHeader" ); 
   put( "AccountRecord", "AccountRecord" ); 
   put( "DriverCardRecord", "DriverCardRecord" ); 
   put( "AssetCardRecord", "AssetCardRecord" );
   put( "SiteCardRecord", "SiteCardRecord" );
}};
2 голосов
/ 10 ноября 2009

Wait; если это будет загружено из файла, не пройдите шаг промежуточного массива! Вам бы пришлось сначала загрузить все это перед созданием массива, иначе вы бы не знали размер массива. Просто создайте HashMap и добавьте каждую запись, когда вы ее читаете.

1 голос
/ 15 ноября 2018

Более кратким с потоками будет:

 import static java.util.Arrays.stream;
 import static java.util.stream.Collectors.toMap;
 import java.util.Map;

     ...

 public static Map<String, String> asMap(String[][] data) {
     return stream(data).collect(toMap( m->m[0], m->m[1] ));
 }

     ...
1 голос
/ 02 августа 2017

Существующие ответы работают, конечно, хорошо, но в интересах постоянного обновления этого сайта новой информацией, вот способ сделать это в Java 8:

String[][] arr = {{"key", "val"}, {"key2", "val2"}};
HashMap<String, String> map = Arrays.stream(arr)
        .collect(HashMap<String, String>::new,
                (mp, ar) -> mp.put(ar[0], ar[1]),
                HashMap<String, String>::putAll);

Java 8 Stream s великолепны, и я рекомендую вам посмотреть их для получения более подробной информации, но вот основы для этой конкретной операции:

  • Arrays.stream получит Stream<String[]> для работы.
  • collect берет ваш Stream и сводит его к одному объекту, который собирает всех членов. Требуется три функции. Первая функция, поставщик, генерирует новый экземпляр объекта, который собирает членов, поэтому в нашем случае это просто стандартный метод для создания HashMap. Вторая функция, аккумулятор, определяет, как включить элемент Stream в целевой объект, в вашем случае мы просто хотим put ключ и значение, определенные как первое и второе значение из каждого массива, в карта. Третья функция, объединяющая, - это функция, которая может объединять два целевых объекта, в случае, если по какой-либо причине JVM решила выполнить этап накопления с несколькими HashMap с (в данном случае, или любым другим целевым объектом в другой случай), а затем необходимо объединить их в один, который в основном предназначен для асинхронного выполнения, хотя обычно это не происходит.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...