【问题标题】:Is it possible to add just the values of a HashMap into another HashMap?是否可以只将一个 HashMap 的值添加到另一个 HashMap 中?
【发布时间】:2022-11-22 00:23:26
【问题描述】:

我有一个 Hashmap HashMap <Integer, Integer> map,我想将 keyset() 类型更改为 BinaryTreeNode,它已经预先声明,而不是我能够做到的 int。但是,我想知道如何按照与原始 HashMap map 中相同的顺序添加适当的 map.values()

这是我的代码

public static BinaryTreeNode parentMapToTree(Map<Integer, Integer> map) {
    HashMap<BinaryTreeNode, Integer> l = new HashMap<>();
    for (int i = 0; i < map.keySet().size(); i++){
      BinaryTreeNode node = new BinaryTreeNode(i);
      l.put(node, map.values());
    }

我应该对我的代码进行哪些更改以确保它可以编译并按我想要的方式执行?

【问题讨论】:

  • 我认为您几乎拥有它,但是您正试图将整个旧地图放入新地图的每个键中——相反,您应该只添加通过查找该特定键获得的内容。
  • 由于 HashMap 没有定义顺序,因此询问您是否可以“以相同顺序”向其添加任何内容没有多大意义。
  • 此外,迭代键和值而不是使用 for 循环会更清晰。一般来说,在现代编程中不鼓励像这样循环索引。
  • @EdwardPeters 所以我只能说 l.put(BinaryTreeNode, map.keyset())?
  • @Droid 那为什么不直接遍历 entrySet 呢?一个简单的for(Entry&lt;Integer, Integer&gt; entry : map.entrySet()) 循环,然后您可以通过entry.getKey();entry.getValue(); 获取键和值(并执行类似l.put(new BinaryTreeNode(entry.getKey()), entry.getValue()); 的操作来填充您的新地图)

标签: java hashmap


【解决方案1】:

如果需要维护插入顺序,则需要创建 LinkedHashMap。 HashMap 不保证顺序。

  LinkedHashMap<BinaryTreeNode, Integer> l = new LinkedHashMap<>();

它像 HashMap 一样工作,但保留顺序。

【讨论】:

    【解决方案2】:

    首先,关于你所拥有的一些注意事项:

    public static BinaryTreeNode parentMapToTree(Map<Integer, Integer> map) {
        HashMap<BinaryTreeNode, Integer> l = new HashMap<>();
        for (int i = 0; i < map.keySet().size(); i++){
          BinaryTreeNode node = new BinaryTreeNode(i);
          l.put(node, map.values());
        }
    

    BinaryTreeNode node = new BinaryTreeNode(i); 可能是错误的 - i 只是索引,这并不意味着任何东西,因为 HashMap 没有以任何定义的方式排序。

    l.put(node, map.values()); 也是错误的 - 这里您插入的值是整个原始地图。

    您可以通过将键集转换为可索引结构(如列表 - 它当前是一个集合)来保存当前代码,然后在该索引处获取键,将其转换为 BinaryTreeNode,查找与键关联的值在旧地图中,然后添加两者。

    我可能有一些语法错误(我不在编译器前),但这看起来像:

    public static BinaryTreeNode parentMapToTree(Map<Integer, Integer> map) {
        List keyList = ArrayList(map.keySet());
        HashMap<BinaryTreeNode, Integer> l = new HashMap<>();
        for (int i = 0; i < keyList().size(); i++){
          Integer key = keyList.get(i);
          BinaryTreeNode node = new BinaryTreeNode(key);
          l.put(node, map.get(key));
        }
    

    但我个人认为这是一种非常糟糕的方式。

    您可能想要做的是迭代条目集:

    public static BinaryTreeNode parentMapToTree(Map<Integer, Integer> map) {
        HashMap<BinaryTreeNode, Integer> l = new HashMap<>();
        for (entry in map.entrySet()){
          BinaryTreeNode node = new BinaryTreeNode(entry.getKey());
          l.put(node, entry.getValue());
        }
    

    后一种方法更简洁,因为它不是手动处理索引,这通常是一种糟糕的做法。使用 stream()map() 函数来完成整个事情甚至完全没有任何 for 循环,而是一次一个步骤,会更干净。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-23
      • 2019-09-13
      • 2021-10-09
      相关资源
      最近更新 更多