Java - 在MAP上删除HASHMAP中的最后一个已知项目

时间:2010-08-18 19:22:03

标签: java arraylist

好的,这是一个不同的BIT。我有一个新的HashMap

private Map<String, Player> players = new HashMap<String, Player>();

如何从中删除最后一个已知项目?也许像这样的某些人?

hey = Player.get(players.size() - 1);
Player.remove(hey);

8 个答案:

答案 0 :(得分:6)

问题是,HashMap没有像列表那样排序。内部顺序取决于密钥的hashCode()值(例如String)。您可以使用LinkedHashMap来保留插入顺序。要删除此处的最后一个条目,可以将迭代器与计数器结合使用,该计数器与大小进行比较并删除最后一个条目。

这很容易。试试这个:

Map<String, Player> players = new LinkedHashMap<String, Players>();
List<String> list = new ArrayList<String>(players.keySet());
map.remove(list.get(list.size()-1));

答案 1 :(得分:4)

我有点困惑。首先,你说你有一个新的ArrayList并且你用一条创建新HashMap的线来说明这一点。其次,Player类真的有静态方法,例如get(int)remove(Object)吗?

HashMap没有特定的订单,ArrayList(与任何其他List一样)。

ArrayList

中删除

如果您有一个玩家列表,那么您可以执行以下操作:

private List<Player> players = new ArrayList<Player>();
// Populate the list of players
players.remove(players.size() - 1);

在这里,我使用了List的{​​{3}}方法,该方法允许删除任意索引处的项目。

HashMap

中删除

如果你有一张球员地图,就没有“最后一项”。当然,你可以迭代地图,其中一个项目最后会弹出,但这并不意味着什么。因此,首先您必须找出要删除的内容。然后,您可以执行以下操作:

private Map<String, Player> players = new HashMap<String, Player>();
// Populate the map of players
// Find the key of the player to remove
players.remove(toRemove);

在这里,我使用了Map的{​​{3}}方法。请注意,为了删除某些键值对,您必须显示键,而不是值。

答案 2 :(得分:2)

HashMap中没有“第一个”和“最后一个”。这是无序的。一切都可以通过它的关键而不是索引来访问。

答案 3 :(得分:1)

简单,只需做一些这样的效果。

1)获取一个键集迭代器;
2)创建Key somelastKey = null
3)迭代迭代器并分配somelastKey直到迭代器完成。
4)最后,做players.remove(somelastKey);

请记住,HashMap是无序的,它取决于对象的hashCode来确定广告订单。

不要使用HashMap,而是尝试使用LinkedHashMap来保持可预测的迭代顺序。

希望这会有所帮助......

答案 4 :(得分:1)

您无法从HashMap中删除。您需要使用LinkedHashMap

答案 5 :(得分:0)

您可能需要扩展HashMap,覆盖put以便缓存密钥,然后创建一个新方法,只删除缓存的密钥。

不幸的是,这只会让您删除最近添加的内容。如果你需要删除最近添加的多次(没有插入删除之间),那你就不走运了。

在这种情况下,我可能会做同样的覆盖,只需将密钥写入List。所以你有一个列表和一个地图。

答案 6 :(得分:0)

添加时:

String key; Player value;
lastKey = key;
map.put(key, value);

//...later...
Player lastAdded = map.remove(lastKey);

除此之外,没有使用LinkedHashMap或以某种方式创建自己的包装图或扩展HashMap的方法。

答案 7 :(得分:0)

你不应该在任何地方使用原始的hashmap,因为这样的事情会发生。

养成在业务逻辑类中包装集合的习惯。

请参阅,在您的情况下,您现在需要关联这两个相关变量 - 您的hashmap和“Last entered”项目,以便您可以删除它。

如果您需要删除其他课程中的最后一项,则需要传递这两项。

每当您发现自己将两个或更多项目合并到一个以上的API中时,您可能错过了一个课程。

创建一个包含hashmap和“lastAdded”变量的新类。放置和删除刚刚转发到hashmap的方法,但put方法也会设置lastAdded变量。

还要确保添加removeLast()方法。

永远不允许在这个类之外访问你的hashmap,它需要完全私有(这就是我所说的包装)。通过这种方式,您可以确保它不会与lastAdded变量(也完全私有)不同步。

重申这些变量的getter和setter是一个糟糕的想法(因为它们与几乎所有实际的OO代码一样)。

您将很快找到一些其他方法,这些方法需要在此类中访问,以便访问您的hashmap中的数据 - 这些方法在当前位置从未感觉到正确。您可能还会注意到这些方法总是传入一个或两个附加参数 - 这些参数可能应该是新类的成员。

一旦你养成了进行实际OO设计的习惯(在这种情况下通过重构),你会发现你的代码更易于管理。为了说明这一点,如果你后来发现你需要多个级别的“删除最后一个”,它将是TRIVIAL添加到你的类,因为它将非常清楚究竟哪些方法可以修改你的哈希表以及你的新“堆栈”应该找到lastItems - 实际上它可能是2行代码更改。

如果你没有创建这个包装类,那么各个位置都会有代码在将代码添加到哈希表时设置“lastAdded”。每个位置都必须进行修改,有些可能在其他类中,要求您使用哈希表传递新堆栈。如果您忘记更改一个位置,将更容易让它们失去同步。