Effectiveyは、ComparableオブジェクトのJavaのコレクションを検索します

user1884155:

私は任意でJava 8アプリケーション有するMap<T, String>Tが延びますComparable<T>

最も簡単な例が使用する整数:

Map<Integer,String> numbers = new HashMap<>(4);
numbers.put(10,"value10");
numbers.put(20,"value20");
numbers.put(30,"value30");
numbers.put(40,"value40");

私は鍵がそれは大きな、そしてラウンドダウンしているが存在しない場合を除き、切り上げ、任意の入力値に近いキーのため、この地図を検索したいです。例えば:

  • 入力-5戻るキー10(入力次に大きい最小のキーにラウンドアップ)
  • 入力8つのリターンキー10(入力次に大きい最小のキーにラウンドアップ)
  • 入力10、リターンキー10(完全一致)
  • 入力11のリターンキー20(入力次に大きい最小のキーにラウンドアップ)
  • 入力40、リターンキー40(完全一致)
  • 入力100の戻るキー40(ラウンドダウンは、どのキーはそれが10より大きい存在しません)

私はすべてのキーの上に単純にループは、すべての必要な比較を行い、これらの基準に基づいて最良の一致するキーを返すという作業の実装を持っています。私のアプリケーションはニーズこの素朴な検索がボトルネックになることができますので、多くの場合、異なる値に同じ地図を確認します。で実証されているように、この他の質問、私は、ソートのTreeMapを大幅に検索時間を増やすかもしれないと考えているが、私はいくつかのガイダンスなしで理解するこのクラスは少し複雑すぎます。

  • どちらのTreeMapの方法私は、この検索を実装するために使用することができますか?
  • どのように以下のalgorhitmはTreeMapのがソートされているという事実の利点を利用して簡単にすることでしょうか?
  • そうでない場合TreeMapの、別のデータ構造は、より多くのこのために適していますか?

ここで素朴な(しかし作業)の実装です。コレクションは、実際に地図のキーセットです。

private T getBestMatchingKeyForValue(Collection<T> keys, T value)
{
    T bestMatchingKeySoFar = null;

    for (T keyToCheck : keys)
    {
        if (bestMatchingKeySoFar == null)
        {
            bestMatchingKeySoFar = keyToCheck;
        }
        else
        {
            int valueComparedToBestMatching = value.compareTo(bestMatchingKeySoFar);
            int valueComparedToKeyToCheck = value.compareTo(keyToCheck);
            int partitionTocheckComparedToBestMatching = keyToCheck.compareTo(bestMatchingKeySoFar);

            int signValueComparedToBestMatching = Integer.signum(valueComparedToBestMatching);
            int signValueComparedToKeyToCheck = Integer.signum(valueComparedToKeyToCheck);
            int signKeyToCheckComparedToBestMatching = Integer.signum(partitionTocheckComparedToBestMatching);

            if (signValueComparedToBestMatching == signValueComparedToKeyToCheck)
            {
                if (signValueComparedToBestMatching == signKeyToCheckComparedToBestMatching)
                {
                    bestMatchingKeySoFar = keyToCheck;
                }
            }
            else if (valueComparedToKeyToCheck == 0)
            {
                bestMatchingKeySoFar = keyToCheck;
            }
            else if (valueComparedToBestMatching != 0)
            {
                if ((this.preferUpperBound && partitionTocheckComparedToBestMatching > 0)
                        || (!this.preferUpperBound && partitionTocheckComparedToBestMatching < 0))
                {
                    bestMatchingKeySoFar = keyToCheck;
                }
            }
        }
    }

    return bestMatchingKeySoFar;
}
shmosel:

TreeMap床と天井の方法は、あなたが探している正確に何を実行します。

TreeMap<K, V> map = ...
K search = ...
K closest = map.ceilingKey(search);
if (closest == null) {
    closest = map.floorKey(search);
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=317488&siteId=1