0

編集:私はJavaプログラミングに非常に慣れていないことをおそらく言及すべきでした。私は約2週間前に言語を始めたばかりです。

この質問に対する答えを探してみましたが、これまでのところ見つけられなかったので、ここで質問します。

私は Dungeons and Dragons Initiative Tracker の Java コードを書いており、エントリでソートするために TreeMap を使用しています。私はまだJavaに非常に慣れていないので、そこにあるすべてを知っているわけではありません。

私の問題は、同じキーが2つある場合、ツリーが値をマージして、値の1つが存在しなくなることです。これが望ましい動作であることは理解していますが、私の場合、それを実現することはできません。この動作を修正するためのエレガントなソリューションがあることを期待していました。これまでのところ、私が持っているのはこれです:

  TreeMap<Integer,Character> initiativeList = new TreeMap<Integer,Character>(Collections.reverseOrder());
  Character [] cHolder = new Character[3];

  out.println("Thank you for using the Initiative Tracker Project.");

  cHolder[0] = new Character("Fred",2);
  cHolder[1] = new Character("Sam",3,23);
  cHolder[2] = new Character("John",2,23);

  for(int i = 0; i < cHolder.length; ++i)
  {         
     initiativeList.put(cHolder[i].getInitValue(), cHolder[i]);
  }

  out.println("Initiative List: " + initiativeList);

Character は、プレイヤーのキャラクター名とイニシアチブ値を追跡する、私が定義したクラスです。

現在、出力は次のとおりです。

Initiative List: {23=John, 3=Fred}

ある種のサブコレクションで TreeMap を使用することを検討しましたが、同様の問題にも遭遇します。私が本当にしなければならないことは、マージを無効にする方法を見つけることです。あなたが私に与えることができるどんな助けにも感謝します。

編集: ダンジョンズ アンド ドラゴンズでは、キャラクターが 20 面ダイスを転がし、その結果にイニシアチブ mod を追加して、全体のイニシアチブを取得します。2 人のプレイヤーが同じ値を取得する場合があります。キーを次のようにフォーマットすることを考えました:

Key = InitiativeValue.InitiativeMod

したがって、Sam のキーは23.3になり、John のキーは23.2になります。キーの型を int ではなく float に変更する必要があることは理解しています。

ただし、その場合でも、2 人のプレイヤーが同じイニシアチブ Mod を持ち、同じイニシアチブ値をロールする可能性があります。実際には、これはあなたが思っている以上に起こります。たとえば、

Peter と Scott の両方がゲームに参加するとします。どちらも 2 のイニシアチブ修正を持ち、20 面ダイスで 10 を振ります。これにより、両方のイニシアチブ値が 12 になります。

それらを既存のマップに配置すると、同じ値であっても両方が表示される必要があります。

Initiative List: {23=John, 12=Peter, 12=Scott, 3=Fred}

私が必要としているものを明確にするのに役立つことを願っています。

4

2 に答える 2

2

私があなたを正しく理解していれば、あなたはたくさんのキャラクターとそのイニシアチブを持っており、この構造をイニシアチブ ID ごとにキーに「反転」したいと考えています。値はそのイニシアチブを持つすべてのキャラクターです。これは MultiMap データ構造によって完全にキャプチャされ、そのうちの 1 つの実装はGuava TreeMultimapです。

これについて魔法のようなものは何もありません。で同様のことを達成できます

TreeMap<Initiative,List<Character>>

これは正確には Guava マルチマップの実装方法ではありませんが、必要なものをサポートできる最も単純なデータ構造です。

これを行う場合、上記をラップし、特定の要件に従って重複検出とリスト管理を処理するメソッドをTreeMap提供する独自のクラスを作成します。add(K key, V value)

于 2012-09-26T00:07:36.323 に答える
0

あなたは「...TreeMapエントリでソートする能力のために...」と言いますが、TreeSet代わりに a を使用することもできます。必要な比較を実行する適切なcompareToメソッドをクラスに実装する必要があります。Characterとを実装することを強くお勧めしhashCodeますequals

次に、 を反復処理すると、オブジェクトが適切な順序でTreeSet取得されます。クラスは、順序付けではなく検索を目的としていることに Character注意してください。Map

于 2012-09-25T23:59:33.553 に答える