1

解決すべき問題があり、Java で会計および簿記ソリューションの部分を作成する必要があります (今のところ、バックエンドだけです)。特定の製品の以前の価格をシステムに保存する必要があるため、HashMap<Date,Integer>.

ここでの問題は、システムが特定の時間に価格を取得し、会計、購入を追跡できる必要があることです (注文はアイテムと購入時間を保存するため、簡単に振り返ることができます)。それでよいのですが、購入日と価格設定日が一致しない場合、単純な get メソッドでは null が返されます。これまでのところ、購入日より前の最初の日付を探して価格を返す検索メソッドを論理的に導き出すことができませんでした。

これを解決するための提案された方法はありますか?

4

3 に答える 3

7

確認することをお勧めしますTreeMap

より前の最も近い日付を取得するには、次のdateように検索します。

return map.get(map.headMap(date, true).lastKey());

上記の内訳:

  • previous = map.headMap(date, true)以前のすべてのエントリ (日付を含む) を返します
  • closestMatchingKey = previous.lastKey()その(上記の)マップの最後のキーを返します
  • map.get(closestMatchingKey)その一致を返します (または、一致しないnull場合)

例:

public static void main(String[] args) {

    TreeMap<Date, String> map = new TreeMap<>();

    map.put(new Date(0), "First");
    map.put(new Date(10), "Second");
    map.put(new Date(20), "Third");
    map.put(new Date(30), "Fourth");
    map.put(new Date(40), "Fifth");

    System.out.println(getClosestPrevious(map, new Date(5)));
    System.out.println(getClosestPrevious(map, new Date(10)));
    System.out.println(getClosestPrevious(map, new Date(55)));
}

private static String getClosestPrevious(TreeMap<Date, String> map, Date date) {
    return map.get(map.headMap(date, true).lastKey());
}

出力:

First
Second
Fifth
于 2012-12-08T11:50:24.053 に答える
2

必要なのは、具体的にはNavigableMap#foorEntryTreeMapメソッドを使用することです(私の強調):

public Map.Entry floorEntry(Kキー)

インタフェースからコピーされた説明: NavigableMap 指定された key以下の最大のキーに関連付けられたキーと値のマッピングを返します。そのようなキーがない場合は null を返します。

定義: インターフェース NavigableMap 内の floorEntry

于 2012-12-08T12:11:45.487 に答える
0

私が理解している限り、マップのキーは日付です。TreeMapその場合は、代わりに移動しHashMapて、「最も近い」日付のロジックを実装するカスタム コンパレータを使用することをお勧めします。compare()正確な一致を必要とせずに、日付が指定された日付に十分近い場合、コンパレータのメソッドは 0 を返します。

于 2012-12-08T11:51:37.150 に答える