1

2 つの文字列キーを持つネストされたマップ (マップ内/マップ内) があります。基本的に私がしていることは、一連のノードがあり、それらの間の最短ルートを見つけることです。ただし、それらを保存して後で使用する必要があるため、次のようにしました。

private Map<String, Map<String,Object>> TravelTime = 
new HashMap<String, Map<String,Object>>();

ループを使用してこのマップに値を与えます。ここで、ParkingDests は別の HashMap のキー (文字列) のセットです。

ParkingDests = ParkingAttributes.keySet().size();
for (int i = 0;i< ParkingDests; i++){
    for (int j = 0;j< ParkingDests; j++){

        <code> TravelTime.put(keyone,keytwo,Shortest) </code>

    }
}

必要なものは次のようなものだと思います:

TraveTime.put(ParkingDests(i),ParkingDest(j), ShortestRoute)

しかし、私はそれを行う方法を見つけることができません。私はGuava Tableを知っています(そして、それがまさに私が必要としているものであることを知っています)が、このコンテキストで解決策を見つけたいと思います.

4

2 に答える 2

3

新しいルートを追加する前に、セカンダリ HashMap が追加されているかどうかを確認する必要があります。ここでは、ParkingDests が String 配列であると想定しています。また、あなたのタグは、ShortestRoute オブジェクトを生成するコードでこのループをラップしていることを意味していると思います。それを一般的なオブジェクトとして保存する必要はまったくありませんが、私たちの利益のために質問をうまく単純化しただけだと確信しています:)

for (int i = 0;i< ParkingDests; i++){
    for (int j = 0;j< ParkingDests; j++){

        <code>
        second = TravelTime.get(ParkingDests[i])
        if(second == null) {
            second = new HashMap<String, Object>()
            TravelTime.put(ParkingDests[i], second);
        }
        second.put(ParkingDests[j],Shortest);
        </code>

    }
}

また、編集した質問のように keySet を ParkingDests として使用しないことをお勧めします。そこから注文が保証されるわけではありません。ParkingDests を配列として保持する必要があります。

于 2013-10-25T19:52:11.350 に答える
1

Graph データ構造を使用することをお勧めします。JGraphTを使用できます。最短経路を計算するDijkstra Algorithmの実装があります。ノードは ParkingDests になり、エッジの重みは移動時間になります。最適なルートはサブグラフです。楽しむ。

于 2013-10-25T20:00:18.707 に答える