【问题标题】:get the highest version number for the id from arraylist in java从java中的arraylist获取id的最高版本号
【发布时间】:2021-12-06 13:55:35
【问题描述】:

我有一个包含这些值的数组列表:

ArrayList<string,string> list= new ArrayList<>();
list.put("A101","2020_1.0");
list.put("A101","2020_3.0");
list.put("A101","2020_2.0");
list.put("A102","2020_2.0");
list.put("A102","2020_1.0");

我需要得到: A101 2020_3.0 和 A102 2020_2.0

【问题讨论】:

  • 它不包含这些值。阅读Map 的文档,尤其是put 的文档。
  • 现在我把它改成了arraylist,你能告诉我吗?

标签: java collections maps linkedhashmap


【解决方案1】:

首先,这里的数据容器似乎不是List&lt;String&gt;,而是Map&lt;String, String&gt;,因为List 没有方法put(K key, V value);,而Map 有。

但是,如果使用方法Map::put,它会用新值覆盖以前的值。因此,可以使用重写的方法put(以及putAll)来实现自定义地图,以比较值并保持“最高”版本。

class MyMap<K, V> extends LinkedHashMap<K, V> {

    private final Comparator<V> valueComparator;

    public MyMap(Comparator<V> valueComparator) {
        super();
        this.valueComparator = valueComparator;
    }

    @Override
    public V put(K key, V value) {
        return compute(key, 
            (k, v) -> v == null ? value // value missing
                                : valueComparator.compare(v, value) < 0 
                                ? value : v // keep the max of two
        );
    }

    @Override
    public void putAll(Map<? extends K, ? extends V> m) {
        m.forEach(this::put);
    }
}

假设在现有示例中,可以像通常的字符串一样比较值,则可以按如下方式创建映射:

// use plain String comparison
Map<String, String> data = new MyMap<>(String::compareTo);

data.put("A101", "2020_1.0");
data.put("A101", "2020_3.0");
data.put("A101", "2020_2.0");
data.put("A102", "2020_2.0");
data.put("A102", "2020_1.0");

System.out.println(data);

输出:

{A101=2020_3.0, A102=2020_2.0}

如果“版本”值具有更复杂的比较规则(例如拆分为9.110.0 中的整数部分,排除某些前缀/后缀等),则需要实现自定义比较器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-26
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    相关资源
    最近更新 更多