編集:私は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}
私が必要としているものを明確にするのに役立つことを願っています。