Java:编程工作站以及从一个工作站移动到另一个工作站所需的时间(需要idea&x27;s)

Java:编程工作站以及从一个工作站移动到另一个工作站所需的时间(需要idea&x27;s),java,data-structures,architecture,Java,Data Structures,Architecture,我正在制作的节目中的一个班级需要保存一个电台列表,以及从一个电台移动到另一个电台所需的时间 我的问题是: 我想确保我不会弄乱时间安排,并希望以某种方式将它们与两个电台联系起来。 例如: 如果我有4个站(站1…站4),我有每对站之间的时间(比如说5、10、15分钟) 如何最好地存储此信息?我使用哪一个收藏? 我曾想过使用hashmap,但问题是我必须使一个键由2个站组成,这是最好的方法吗 提前谢谢 您的密钥可以由2个对象组成,为什么这对您来说是个问题 public final class Pair

我正在制作的节目中的一个班级需要保存一个电台列表,以及从一个电台移动到另一个电台所需的时间

我的问题是:

我想确保我不会弄乱时间安排,并希望以某种方式将它们与两个电台联系起来。 例如:

如果我有4个站(站1…站4),我有每对站之间的时间(比如说5、10、15分钟)

如何最好地存储此信息?我使用哪一个收藏? 我曾想过使用hashmap,但问题是我必须使一个键由2个站组成,这是最好的方法吗


提前谢谢

您的密钥可以由2个对象组成,为什么这对您来说是个问题

public final class Pair<T> {
    public final T o1, o2;

    public Pair(T o1, T o2) {
        this.o1 = Objects.requireNonNull(o1);
        this.o2 = Objects.requireNonNull(o2);
    }

    // make hashCode symmetric
    @Override
    public int hashCode() {
       return o1.hashCode() + o2.hashCode();
    }

    // make equals also symmetric
    @Override
    public boolean equals(Object other) {
        if (other == this) return true;
        if (other == null || !other.getType().equals(getType())) return false;
        T o = (T) other;
        return (o1.equals(o.o1) && o2.equals(o.o2)) || (o2.equals(o.o1) && o1.equals(o.o2));
    }
}
然后,要获得两个站点之间的计时,请使用:

Double t  = timings.get(new Pair(station1, station2));
if (t != null) {
    // stations are connected
}
或者,同样的结果

Double t1 = timings.get(new Pair(station2, station1)); 
这种方法不如邻接数组快,但它有自己的优点:1)不需要枚举站或将
对象映射到数组索引,2)以防它在空间消耗方面获胜。

如下:

int nStations = ...;
int[][] travelTime = new int[nStations][nStations];
for (int i = 0; i < nStations; i++) {
    travelTime[i][i] = 0; //distance from the station to itself
                          //is equal to zero, because you are already there 
}
稍后只需使用它:)

如果站点之间没有直接连接,您可以通过

travelTime[x][z] = -1; //if negative value - no direct connection.

此外如果要使用字符串对象作为电台名称,当然可以 创建一个

HashMap<String, Integer> nameToIndex = new HashMap<String, Integer>();
如果你想得到纽约和芝加哥之间的旅行时间,只需使用

travelTime[nameToIndex.get("New York")][nameToIndex.get("Chicago")];

为什么使用数组

我还想解释为什么在我看来使用2d数组比使用对象的HashMap更好。 如果您计划使用此程序检查10个站点之间的距离,则不会看到任何差异。但是,如果这个数字增加到,比如说,10000,那么性能增益将是巨大的(您可以自己测量)

我还认为,这种解决方案在出现任何问题时都更容易调试,因为它非常简单。另一方面,如果您为每个连接创建一个单独的对象,那么最终将得到非常难以看穿的巨大集合


当站点更改时,可能会遇到一个问题。因为必须更改整个数组的索引才能反映此更改,所以这比从集合中删除对象要困难得多。但由于电台不经常变化,我认为更重要的是关注性能。

亲吻索引为
行程时间[a][b]
的2D阵列有什么问题?您的设计条件是什么?由于这看起来像是一项考试或家庭作业,你必须拥有什么,你需要使用什么,以及在设计方面有什么不同。正如High Performance Mark所说,即使不是所有的电台都直接连接,2D阵列似乎是最好的主意。唯一的例外是,如果你最终使用稀疏矩阵,因为连接非常罕见,但从你所说的情况来看,这是不可能的。如果我理解正确,你可以解决是否使用2个站点索引2D数组,其值是旅行时间?是的,Agnaroc,这就是我的意思。如果你想变得更复杂,可以把这个数组想象成一个邻接矩阵,权重表示旅行时间。搜索术语邻接矩阵,你就会明白了。
if(!(T的其他实例))返回false比较
getType()
对于非final类更好<代码>如果(other==null | |!other.getType().equals(getType())返回false@weston很好,谢谢!没错。但最重要的是,你不能保证对称性的保持,因此平等契约被打破了
final
可以使用
instanceof
,但最好还是坚持使用
getType
,以防以后删除
final
。@weston是的,我现在看到了。我很感激你的解释。这是对上述问题的过度设计。
HashMap<String, Integer> nameToIndex = new HashMap<String, Integer>();
nameToIndex.put("New York", 0);
nameToIndex.put("Chicago", 1);
travelTime[nameToIndex.get("New York")][nameToIndex.get("Chicago")];