Java:编程站和从一个站移动到另一个站所需的时间(需要想法)

Java: Programming stations and the time it takes to move from 1 station to the other (need idea's)

我正在制作的 类 程序中的一个需要保存电台列表以及从一个电台移动到另一个电台所需的时间。

我的问题:

我想确保我不会弄乱时间,并希望以某种方式 link 将它们发送到 2 个站点。 示例:

如果我有 4 个站(站 1 ... 站 4)并且我知道每对站之间花费的时间(比如 5、10、15 分钟)。

我怎样才能最好地存储这些信息?我使用哪个集合? 我虽然使用哈希图,但问题是我必须制作一个由 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));
    }
}

那么你可以使用HashMap:

Map<Pair<Station>, Double> timings = new HashMap<>();
timings.put(new Pair(station1, station2), 5.0);
timings.put(new Pair(station1, station3), 10.0);
//....

然后,要获得两个站之间的时间,请使用:

Double t  = timings.get(new Pair(station1, station2));
if (t != null) {
    // stations are connected
}

或者,结果相同,

Double t1 = timings.get(new Pair(station2, station1)); 

这种方法不如邻接数组快,但它有自己的优点:1) 您不需要枚举站点或将 Station 对象映射到数组索引,2) 在 sparse graph它在space消费中获胜。

像这样:

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[source][destination] = ...; //distance from station x to station y

稍后只需使用它:)。

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

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

此外如果你想使用String对象作为站名,你当然能够 只需创建一个

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")];

为什么数组

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

我还认为,如果出现任何问题,此解决方案更易于调试,因为它非常简单。另一方面,如果你为每个连接创建一个单独的对象,你最终会得到一个很难看穿的巨大集合。

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