我需要在java中使用n维结构(map)。
我们假设我们有一家动物商店,我们希望保持某种动物的最低价格。
让我们说我们的标准是:
结果价格应该是所有相关配置中最低的。
例如分钟。价格为
所以棕色,1岁,狗,女性的结果价格是10.
对于黑人,2岁,猫,男性,20岁。 等。
那有什么结构吗?如果没有,那么实施它的最佳方式是什么。
答案 0 :(得分:2)
在我第一次回答这个问题时,我错过了将价格分配给属性组合的要求。这个答案应该很好地处理这个部分。
以某种方式为每个属性建模,以便没有两个属性具有相同的值。因此,例如,如果您有尺寸眼睛颜色和毛发颜色,不要只使用字符串,因为棕色可能属于它们中的任何一个。我假设有一个共同的接口'属性'没有这样的接口存在你可能会使用'对象'。所有这些类都需要正确实现'equals'
现在创建一个类来模拟属性组合及其价格:(以下是没有IDE或编译器编写的。错误被认为是读者的故意培训)
public class AttributeCombination{
private final Set<Attribute> attributes;
public AttributeCombination(Set<Attribute> attributes){
this.attributes = attributes;
}
public boolean matches(Set<Attribute> attributes){
for(a : this.attributes){
if (!attributes.contains(a))
return false;
}
return true;
}
}
现在有一个正确排序的类,将属性与价格相结合
public class AttributeWithPrice implements Comparable<AttributeWithPrice> {
private final AttributeCombination attributes;
private final int price;
// add the obvious constructor or switch to scala
public int compareTo(AttributeWithPrice other){
return this.price - other.price // or the other way round, I can never remember
}
}
现在你可以创建一个AttributeWithPrice对象列表,对它进行排序,所以小价格先来,然后迭代它,直到你找到匹配的元素。
答案 1 :(得分:1)
只需为每个“维度”使用Map和不同的类(可能是枚举)。
维度成为地图的关键(键类型必须是常见的超类型,因此可能是对象),值类型将是价格(从您的示例判断为int)。
要确定价格,请根据每个维度选择价格并使用最小值。完成。
答案 2 :(得分:1)
我认为您不能仅使用地图或一小组地图,因为您要对多个条件的组合定义限制。我没有看到确定使用的适当密钥的方法,因为您没有在多维空间中定义点的限制,而是根据可能重叠的各种形状的空间。你的ANY
在功能上不是该维度上的一个独特点,而是涵盖所有其他定义点的范围,因此你不能对它进行简单的相等比较,这就是Map键所需要的。
我会将所有限制保留在List
中并针对您想要找到最低价格的宠物对象进行检查。制作一个Restriction
课程并为其提供appliesTo(Pet pet)
方法。
如果您最终遇到大量限制,如果您为每个条件引入了“通配符”的概念,则可以使用Maps在其上构建“索引”。然后,您可以构建映射每个条件的每个值的映射,包括可以应用于具有该条件的任何值的宠物的所有条件的“通配符”,以及可能适用于该条件的所有最低价格条件的列表。但是,这将是更多的代码,除非你的大部分限制
,否则可能不会给你太多的加速