好的,这是一个不同的BIT。我有一个新的HashMap
private Map<String, Player> players = new HashMap<String, Player>();
如何从中删除最后一个已知项目?也许像这样的某些人?
hey = Player.get(players.size() - 1);
Player.remove(hey);
答案 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”。每个位置都必须进行修改,有些可能在其他类中,要求您使用哈希表传递新堆栈。如果您忘记更改一个位置,将更容易让它们失去同步。