【问题标题】:HashMap<String, Object> How to replace 1 value of the Object?HashMap<String, Object> 如何替换 Object 的 1 个值?
【发布时间】:2012-09-13 01:24:46
【问题描述】:
Map<String, Data> map = new HashMap<String,Data>();
map.put("jan", new Data("RED","M4A1",5,0,0));

如何更改 Data 对象的值 RED?,而无需使用键从映射中获取所有信息并将其放回,如下所示:

map.put("jan" new Data("Blue",
      map.get("jan").Brand,
      map.get("jan").Storage,
      map.get("jan").Sold,
      map.get("jan").Bought)); 

那么我怎样才能改变数据对象的 1 个值而不是全部重做呢?

【问题讨论】:

    标签: java object map hashmap


    【解决方案1】:

    请找代码sn-p:

    Map<String, Data> map = new HashMap<String,Data>();
    
    public class Data{
    
    private String color;
    
      public void setColor(String color) {
        this.color = color;
      }
    
    public String getColor() {
        return this.color;
      }
    
    publicData(String color){
    this.setColor(color);
    }
    }
    
    
    map.put("jan", new Data("RED","M4A1",5,0,0));
    

    现在你可以这样做了:

    Data data = map.get("jan");
    data.setColor("black");
    

    这会起作用。

    这里的数据类只包含一个字段,即颜色。您可以添加更多字段。 谢谢

    【讨论】:

    • 你能进一步解释你的答案吗?
    • 错误的代码片段,不好的做法。在您的示例中数据是可变的,因此您不需要将引用作为值放回映射,因为通过 get() 获取的引用不会改变。
    【解决方案2】:

    假设Data 是可变的,您可以设置"RED" 字段:

    Map map = new HashMap();
    map.put("jan", new Data("RED","M4A1",5,0,0));
    // Later...
    map.get("jan").setColor("BLUE");
    

    如果 Data 不是可变的,那么您唯一的选择是 put 您写入的新值。

    【讨论】:

      【解决方案3】:

      将适当的设置器添加到您的 Data 类,例如

      class Data {
          setColor(String color){...}
      }
      
      
      map.get("jan").setColor("BLUE");
      

      【讨论】:

        【解决方案4】:

        假设Data 具有settercolor 属性:

        public class Data {
          private String color;
        
          public void setColor(String color) {
            this.color = color;
          }
        }
        

        您可以只get 所需的Data 对象并设置其属性:

        Data data = map.get("jan");
        data.setColor("blue");
        

        【讨论】:

          【解决方案5】:

          这取决于Data 是否可变。例如,你可以写:

          Data data = map.get("jan");
          data.setColor("Blue");
          

          不要忘记地图只包含对象的引用,因此如果您更改对象内的数据,那么如果稍后有人从地图中获取引用,就会看到该更改。

          或者如果它是不可变的,它可能有一个withColor 方法,所以你可以这样写:

          Data data = map.get("jan");
          map.put("jan", data.withColor("Blue"));
          

          如果不了解您的 Data 类型(我希望这不是您班级的真名),就很难再说下去了。

          (我也希望你的类没有真正的 Pascal 大小写字段,我希望这些字段是私有的,但那是另一回事......)

          【讨论】:

          • 如果我理解正确,OP 不想做 get 操作等,
          • @Nambari “没有使用钥匙从地图中获取所有信息并将其放回”我的解释是他只是不想创建新对象并将 put 重新放入地图。
          • 它似乎是可变的。第一个选项完成了这项工作。谢谢。
          猜你喜欢
          • 2014-07-20
          • 2018-07-16
          • 2020-01-08
          • 1970-01-01
          • 2012-10-25
          • 1970-01-01
          • 2017-11-04
          • 2016-03-10
          • 2021-11-26
          相关资源
          最近更新 更多