首先,这里的数据容器似乎不是List<String>,而是Map<String, String>,因为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.1 和10.0 中的整数部分,排除某些前缀/后缀等),则需要实现自定义比较器。