【问题标题】:Immutable keys - fixed length map in Java不可变键 - Java 中的固定长度映射
【发布时间】:2018-09-03 16:29:11
【问题描述】:

在 Java 中有没有办法创建具有固定大小和长度的集合(地图)? 即,我想用 K 个常量键(例如字符串)对其进行初始化,但仍希望能够更改值。

编辑: 测试用例有固定数量的对象,每个对象对应一个数字(浮点数)。每次发生应用程序中的特定事件时,我都想将集合中的所有数字相乘,但与“导致”事件的对象对应的数字除外。 数字在逻辑上不是对象的属性。

【问题讨论】:

  • 具体原因是什么?你能分享一下这个需求的背景吗?
  • 好吧,您可以使用枚举而不是字符串(如果需要,可以使用任何映射来获取字符串的枚举)。然后你可以使用EnumMap
  • 当您说您希望能够更改值时,您的意思是要更改它们的对象类型还是仅仅更改它们的值?

标签: java collections immutability


【解决方案1】:

我建议您先查看Mike's answer 以了解如何解决此问题,然后对他提供的代码进行一些更改,使其适用于您的情况:

import java.util.HashMap;

public class InstrumentedHashMap<K> extends HashMap<K, Float> {

    private static final long serialVersionUID = 1L;
    private int MAX;

    public InstrumentedHashMap(int capacity) {
        super();
        MAX = capacity;
    }

    @Override
    public Float put(K key, Float value) {
        if (super.size() >= MAX && !super.containsKey(key)) {
            return null;
        } else {
            super.put(key, value);
            return value;
        }
    }

    public void event(K trigger, int multiplyAmount, float subtractAmount) {
        super.entrySet().stream().forEach(e -> {
            if (!e.getKey().equals(trigger))
                e.setValue(e.getValue() * multiplyAmount);
            else
                e.setValue(e.getValue() - subtractAmount);
        });
    }
}

您可以使用InstrumentedHashMap#event 方法来处理您的“特定事件”,multiplyAmount 参数是您要乘以浮点数的值。

【讨论】:

  • 太棒了,正是我所需要的。 @cardinal,有没有办法在等于触发器的键上应用具有不同 lambda 的 foreach?(即在同一流中的不同键上应用两个函数)
  • @DsCpp 确定有,只需从 !e.getKey().equals(trigger) 中删除 NOT 运算符 !
  • 在同一个流中?在过滤器之后我无法访问等于的键,它不再是流的一部分
  • @DsCpp 你能给我一个你想要做什么的例子吗?我不明白你想要什么。
  • 例如,将所有不相等的键乘以 multiplyAmount,将等于 sub 的键乘以 SubtractAmount
猜你喜欢
  • 1970-01-01
  • 2011-02-25
  • 2011-11-19
  • 1970-01-01
  • 2018-06-14
  • 1970-01-01
  • 2018-07-28
  • 1970-01-01
  • 2013-07-09
相关资源
最近更新 更多