0

编辑:我可能应该提到我对 Java 编程非常陌生。大约两周前,我刚开始学习这种语言。

我试图寻找这个问题的答案,但到目前为止我还没有找到答案,所以这就是我在这里问它的原因。

我为 Dungeons and Dragons Initiative Tracker 编写了 Java 代码,并且我使用 TreeMap 来实现对条目进行排序的能力。我对java还是很陌生,所以我不知道那里的一切。

我的问题是,当我有两个相同的键时,树会合并这些值,使得其中一个值不再存在。我知道这可能是可取的行为,但就我而言,我不能发生这种情况。我希望有一个优雅的解决方案来解决这个问题。到目前为止,我所拥有的是:

  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}

我考虑过使用带有某种 subCollection 的 TreeMap,但我也会遇到类似的问题。我真正需要做的只是找到一种禁用合并的方法。谢谢你们能给我的任何帮助。

编辑:在龙与地下城,一个角色掷一个 20 面的骰子,然后将他们的主动模式添加到结果中以获得他们的总主动权。有时两个玩家可以获得相同的值。我考虑过像这样格式化密钥:

Key = InitiativeValue.InitiativeMod

因此,对于 Sam 来说,他的密钥是23.3,而 John 的密钥是23.2。我知道我需要将键类型更改为 float 而不是 int。

然而,即使有这两个玩家也可以拥有相同的主动模式并掷出相同的主动值。实际上,这种情况发生的次数比你想象的要多。例如,

假设彼得和斯科特都加入了游戏。他们都有 2 的先攻修正值,并且他们都在 20 面的骰子上掷出 10。这将使他们的倡议值都为 12。

当我将它们放入现有地图时,它们都需要显示,即使它们具有相同的值。

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

我希望这有助于澄清我需要什么。

4

2 回答 2

2

如果我理解正确的话,你有一堆角色和他们的主动权,并且想要通过主动ID“反转”这个结构以键,值是所有具有该主动权的角色。MultiMap 数据结构完美地捕捉到了这一点,其中一种实现是Guava TreeMultimap

这没有什么神奇之处。您可以通过

TreeMap<Initiative,List<Character>>

这并不完全是 Guava 多图的实现方式,但它是可以支持您需要的最简单的数据结构。

如果我这样做,我会编写自己的类来包装上述内容,TreeMap并提供一种add(K key, V value)根据您的特定要求处理重复检测和列表管理的方法。

于 2012-09-26T00:07:36.323 回答
0

您说您是“...aTreeMap因为它能够在输入时进行排序...”-但也许您可以只使用 aTreeSet代替。你需要在你的类上实现一个合适的compareTo方法来执行你想要的比较;Character我强烈建议您也hashCode实施equals

然后,当您遍历 时TreeSet,您将以Character适当的顺序获取对象。请注意,Map类旨在用于查找目的,而不是用于排序。

于 2012-09-25T23:59:33.553 回答