这可能是数据类型的完全错误用法,但我正在尝试创建某种类型的Map-Set,所以在插入地图之前我正在尝试使用
//Material is custom class
Map<Integer, Material> x = TreeMap();
if(!x.containsValue(new Material))
x.put(int val, new Material);
我对此的期望是它会比较从同一数据生成的两个对象将返回true,但看起来情况并非如此。为什么会这样,并且除了遍历整个地图以查明是否有任何元素包含所有字段与传入字段相同的材料外,是否存在现有解决方案?
答案 0 :(得分:2)
有一个定义良好的类材料
public class Material extends Comparable<Material> {
final int a;
final String b;
...
public Material(int a, String b, ...) {
this.a = a;
this.b = b;
}
@Override
int compareTo(Material other) {
int cmp = Integer.compare(a, other.a);
if (cmp == 0) {
cmp = b.compareTo(other.b);
}
...
return cmp;
}
@Override
public boolean equals(Object other) {
if (other == null || !(other instanceof Material)) {
return false;
}
return compareTo((Material) other) == 0;
}
@Override int hashCode() {
return ...;
}
A Set
就足够了:
Set<Material> materials = new HashSet<>(); // hashCode+equals
Set<Material> materials = new TreeSet<>(); // compareTo
现在我已经创建了材料final
的字段,因此对象是不可变的,因为更改会对集合排序造成严重破坏。
对于可变质量,如数量:
Map<Material, Integer> stock = new HashMap<>();
Material material = new Material(...);
stock.put(material, 100);
int quantity = stock.getOrDefault(material, 0); // Java 8
int quantity = 0; // Java 7
{
Integer q = stock.get(material);
if (q != null) {
quantity = q;
}
}