Java 将静态2D字符串数组转换为HashMap

Java 将静态2D字符串数组转换为HashMap,java,Java,将字符串的2D数组转换为HashMap最简单的方法是什么 举个例子: 最终字符串[][]sheetMap={/*XSD名称,XSL工作表名称*/ {“文件头”,“文件头”}, {“AccountRecord”,“AccountRecord”}, {“DriverCardRecord”,“DriverCardRecord”}, {“AssetCardRecord”、“AssetCardRecord”}, {“SiteCardRecord”,“SiteCardRecord”} }; 这很可能是从

将字符串的2D数组转换为HashMap最简单的方法是什么

举个例子:

最终字符串[][]sheetMap={/*XSD名称,XSL工作表名称*/
{“文件头”,“文件头”},
{“AccountRecord”,“AccountRecord”},
{“DriverCardRecord”,“DriverCardRecord”},
{“AssetCardRecord”、“AssetCardRecord”},
{“SiteCardRecord”,“SiteCardRecord”}
};

这很可能是从一个文件加载的,并且会更大。

final Map Map=new HashMap(sheetMap.length);
final Map<String, String> map = new HashMap<String, String>(sheetMap.length);
for (String[] mapping : sheetMap)
{
    map.put(mapping[0], mapping[1]);
}
对于(字符串[]映射:sheetMap) { put(映射[0],映射[1]); }
如果您只想以方便的方式初始化地图,可以使用:

Map sheetMap=newhashmap(){{
put(“FileHeader”、“FileHeader”);
卖出(“账户记录”、“账户记录”);
put(“DriverCardRecord”、“DriverCardRecord”);
卖出(“资产记录”、“资产记录”);
放置(“SiteCardRecord”、“SiteCardRecord”);
}};

等待;如果要从文件加载,请不要执行中间数组步骤!在创建数组之前,您必须先加载所有数据,否则您将不知道数组的大小。只需创建一个HashMap,并在阅读时添加每个条目。

当然,现有的答案工作得很好,但是为了不断用新信息更新此站点,这里有一种在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);
String[]arr={{“key”,“val”},{“key2”,“val2”};
HashMap=Arrays.stream(arr)
.collect(HashMap::new,
(mp,ar)->mp.put(ar[0],ar[1]),
HashMap::putAll);
Java 8
Stream
s非常棒,我鼓励您查找更多详细信息,但以下是此特定操作的基础知识:

  • Arrays.stream
    将获得一个
  • collect
    获取您的
    ,并将其缩减为一个收集所有成员的对象。它有三个功能。第一个函数是supplier,它生成一个收集成员的对象的新实例,因此在我们的例子中,只使用标准方法创建
    HashMap
    。第二个函数是累加器,它定义了如何将
    流的一个成员
    包含到目标对象中,在您的例子中,我们只想
    键和值(定义为每个数组的第一个和第二个值)放入映射中。第三个函数是combiner,它可以组合两个目标对象,如果出于任何原因,JVM决定使用多个
    HashMap
    s(在本例中,或在另一种情况下的任何其他目标对象)执行累加步骤,然后需要将它们组合成一个,这主要用于异步执行,尽管通常不会发生

作为tradeJmark的一个稍微干净的替代方案回答:

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());
}
String[][]arr=//您的二维数组
Map arrMap=Arrays.stream(arr.collect)(Collectors.toMap(e->e[0],e->e[1]);
//精神检查!
对于(条目e:arrMap.entrySet()){
System.out.println(e.getKey()+“:”+e.getValue());
}

使用流更简洁的方法是:

 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] ));
 }

     ...
导入静态java.util.Arrays.stream;
导入静态java.util.stream.Collectors.toMap;
导入java.util.Map;
...
公共静态映射asMap(字符串[][]数据){
返回流(数据).collect(toMap(m->m[0],m->m[1]);
}
...

Java 8路

  public static Map<String, String> convert2DArrayToMap(String[][] data){
    return Arrays.stream(data).collect(Collectors.toMap(m -> m[0], m -> m[1]));
  }
公共静态映射convert2daraytomap(字符串[][]数据){
返回Arrays.stream(data.collect(Collectors.toMap(m->m[0],m->m[1]);
}
带循环

public static Map<String, String> convert2DArrayToMap(String[][] data)
  {
    Map<String, String> map = new HashMap<>();
    for (String[] m : data)
    {
      if (map.put(m[0], m[1]) != null)
      {
        throw new IllegalStateException("Duplicate key");
      }
    }
    return map;
  }
公共静态映射convert2daraytomap(字符串[][]数据)
{
Map Map=newhashmap();
for(字符串[]m:数据)
{
if(map.put(m[0],m[1])!=null)
{
抛出新的IllegalStateException(“复制密钥”);
}
}
返回图;
}

我可能应该补充一点,除了我现在正在做的元素循环之外,还有一种收集方法可以用来将这个2D数组传递到HashMap实例中吗?我不知道这一点-我认为不可能在所有数组元素上实现比简单循环更有效的方法。因此,除了简洁之外,你不会得到任何东西,你可以把它放在你自己的
Utils
类型的类中,再次复制它。是的,这就是计划。但是,我现在不知道信息将存储在哪里,所以我只是将其硬编码到数组中。它确实提出了这样一个问题:集合框架是否已经包含了一个实用方法来完成这项任务,即使它实现起来很简单。我宁愿尽可能在收藏中使用一种方法。啊。嗯,是的,没有。如果它接受了,它将接受某个对象的集合,而不是数组。也许是地图的入口。但这并不是很有用。循环更好。这可能会产生一些负面后果,并且被广泛认为是一种反模式——更不用说,它实际上并没有回答这个问题。它不从2D数组转换,甚至不涉及2D数组。哇,这比我的好得多,我不敢相信我不知道这个存在!太好了,谢谢!
  public static Map<String, String> convert2DArrayToMap(String[][] data){
    return Arrays.stream(data).collect(Collectors.toMap(m -> m[0], m -> m[1]));
  }
public static Map<String, String> convert2DArrayToMap(String[][] data)
  {
    Map<String, String> map = new HashMap<>();
    for (String[] m : data)
    {
      if (map.put(m[0], m[1]) != null)
      {
        throw new IllegalStateException("Duplicate key");
      }
    }
    return map;
  }