4

私はJava、特に以下で議論しているトピックに非常に慣れていませんが、これを解決するために多くの時間を費やし、このサイトで以前に提供された回答を読んでいますが、実際には何も見つかりません直接要点なので、これは尋ねる価値があると思いました。

私の質問は、実際には 2 つあります。私が解決しようとしている実際の問題には、オーダーブック プログラムの構築が含まれており、価格と時間の優先度を使用して並べ替えたいと考えています。最終的な目標は、最初に価格に基づいて、次に時間に基づいてコンパレーターを実装する、私が作成したクラスHasMap<ticker, TreeMap<Priority,Order>>がどこにあるかのような構造を構築することです。Priorityこれを行うと、ここで尋ねている質問にたどり着きました (私が取り組んでいることの実際の設定はあまり関係ありませんが、なぜこれを見ているのかという感覚を与えたいと思います)。

TreeMapキーKと値でを構築したいとしますV。次に、もちろんTreeMap、オブジェクトを比較する方法を知る必要がありますK。私の質問:K既にコンパレータを実装し、比較メソッドを定義している場合、それをTreeMap読みますか? それとも、コンストラクターでコンパレーターを指定する必要がありますか? この質問に最も近いのは、次のTreeMapように、を使用してクラス内にコンパレータ クラスを作成することです。Java: SortedMap, TreeMap, Comparable? 使い方?

さて、これまで実際にコンパレーターをコンストラクターに渡してきましたが、問題なくビルドされているようです。しかし、これを に渡そうとするとHashMap、エラーが発生します。コードは次のとおりです。

protected Comparator<Priority> priorityCompare;

protected TreeMap<Priority, Order> _buy = new TreeMap<Priority, Order>((Comparator<? super Priority>) priorityCompare);

protected HashMap<String, TreeMap<Priority, Order>> _buyBook;
protected HashMap<String, TreeMap<Priority,Order>> _sellBook;

TreeMap問題は、 s 内のHashMaps で this を使用したいのですが、Comparatorこれを行うと Java が怒ってしまうことです。私の 2 番目の質問は次のとおりです。このような構造 (HashMap(-,TreeMap)) を使用したい場合、TreeMap でカスタム コンパレータを使用する場合、どのようにそれを行うのですか?

編集:これについては上で述べましたが、私が話していることを示していませんでした。申し訳ありません。私が実際に望んでいる状況は次のようなものです。

protected HashMap<String, TreeMap<Priority, Order>((Comparator<? super Priority>) priorityCompare)> _buyBook;
protected HashMap<String, TreeMap<Priority,Order>((Comparator<? super Priority>) priorityCompare)> _sellBook;

そうすれば、TreeMaps は、クラス Priority で Comparator を使用する方法を知ることができます。ただし、これを行うと、構文エラーが発生します (これらのトークンを削除するように指示するだけです)。また、値として _buy (最初のコード ボックスに記述されているとおり) を渡そうとしましたが、それは機能せず、実行するとすぐに愚かであることがわかりました。とにかく、上記の HashMap 内で K のキーを比較する方法を TreeMap にどのように認識させることができるかという問題は、私が抱えているより大きな問題です。

4

1 に答える 1

3

TreeMap実装のキーが、、の場合、equals()hashCode()キーComparable<Key>クラスTreeMapcompareTo()メソッドを使用します。

編集:

あなたのコードに関しては、EclipseでJava7をコンパイルするときにエラーは発生しません。私もこれを行うことができました、キャストは必要ありません:

protected Comparator<Priority> priorityCompare;
protected TreeMap<Priority, Order> _buy = new TreeMap<Priority, Order>(priorityCompare);

編集2:

現状のコードは有効なJavaではありません。検討:

protected Map<String, Map<Priority, Order>> _buyBook = 
    new HashMap<String,Map<Priority,Order>>();
public void init() 
{
    _buyBook.put("key1", _buy);
    // or
    _buyBook.put("key1", new TreeMap<Priority, Order>(priorityCompare));
}

_buyBookの宣言は、HashMap唯一をインスタンス化します。のインスタンスを作成する必要がTreeMap<Priority, Order>ありput()ますHashMap。含まれている各をインスタンス化するまで、コンパレータを設定することはできませんTreeMap

于 2012-11-24T06:34:53.443 に答える