繁体   English   中英

Java中的n维结构/地图

[英]n-dimensional structure / map in java

我需要Java中的n维结构(地图)

假设我们有一家动物商店,并且希望对某些类型的动物保持最低价格。

假设我们的标准是:

  • 类型:猫,狗,任何。
  • 年龄:1,2,ANY。
  • 颜色:棕色,红色,任意色。
  • 性别:男,女,任何。

结果价格应为所有相关配置中的最低价。

例如分钟 价格

  • 猫是20
  • 1岁是:10,
  • 棕猫:25,
  • 其他:30;

因此,棕色,1岁,狗,雌性的结果价格是10。

黑色,2岁,猫,男性为2​​0,依此类推。

是否有任何结构? 如果没有,那么实现它的最佳方法是什么。

在我第一次回答这个问题时,我错过了可以将价格分配给属性组合的要求。 这个答案应该很好地处理了这一部分。

以某种方式对每个属性建模,以使两个属性都不具有相同的值。 因此,例如,如果您具有眼睛颜色和皮毛颜色的尺寸,则不要仅使用“字符串”,因为棕色可能属于它们之一。 我假设没有这样的接口,但有一个通用接口“属性”,您可以改用“对象”。 所有这些类都需要正确实现“等于”

现在创建一个类来对属性及其价格组合进行建模:(以下内容是在没有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对象的列表,对它进行排序,这样小价格首先出现,然后遍历它,直到找到匹配的元素。

只需为每个“维度”使用一个Map和一个不同的类(可能是枚举)。

尺寸成为地图的键(键类型必须是通用的超类型,因此可能是对象),而值类型将是价格(根据示例判断)。

要确定价格,您可以根据每个维度选择价格并使用最小值。 完成。

我认为您不能为此使用一个地图或一小套地图,因为您想定义多个条件组合的限制。 我没有确定使用适当键的方法,因为您不是在多维空间中的点方面定义限制,而是在各种形状的可能重叠的空间方面定义限制。 从功能ANY并不是该维度上的唯一点,而是覆盖所有其他定义点的范围,因此您无法对其进行简单的相等比较,这就是Map键所需要的。

我只是将所有限制都保留在一个List并对照您要查找最低价格的宠物物品检查所有这些限制。 制作一个Restriction类,并给它一个appliesTo(Pet pet)方法。

如果最终遇到了一大堆限制,则可以在每个条件中引入“通配符”的概念时,使用Google Maps在其上建立“索引”。 然后,您可以将每个条件的每个值(包括可能适用于具有该条件的任何值的宠物的所有条件的“通配符”)映射到可能适用于该条件的所有最低价格条件的列表。 但是,这将需要更多代码,除非您有大部分限制,否则可能不会给您太多加速

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM