如何从哈希图中删除重复的对象?

时间:2018-10-25 13:32:56

标签: java hashmap

我已经尝试了好几个小时,这个站点上只有一个问题接近,但是所有答案都被用到了比我所能理解的要复杂得多的概念,因此我无法根据我的代码进行编辑。 / p>

这是地图:

private Map<Integer, Item> inventory;
public Inventory() {
    inventory = new HashMap<>();
}

以下是添加的对象:

Inventory inv = new Inventory();
Item obj1 = new Potion("Test", 20, "TESTING");
Item obj2 = new Potion("TES2", 30, "ANOTHER TEST");
Item obj3 = new Potion("TesT 3", 220, "TESTS");
Item sword = new Weapon("TES T 4", 42, "t");
Item weapon3 = new Weapon("dupetest", 100, "test dupes.");
Item waraxe = new Weapon("6th test", 2050, "a test for the inv");
Item bow = new Weapon("7 teST", 12, "test number 7");
Item weapon = new Weapon("dupetest", 100, "test dupes.");
Item weapon2 = new Weapon("dupetest", 100, "test dupes.");
inv.add(obj1, obj2, weapon3, obj3, sword, waraxe, bow, weapon, weapon2);

请注意,所有对象的类型均为Item,请注意,武器3,武器和武器2是完全相同的对象:相同的哈希码,状态和所有内容。

以下是Item的hashCode()和equals()方法:

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((name == null) ? 0 : name.hashCode());
    result = prime * result + value;
    return result;
}
@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Item other = (Item) obj;
    if (name == null) {
        if (other.name != null)
            return false;
    } else if (!name.equals(other.name))
        return false;
    if (value != other.value)
        return false;
    return true;
}

我尝试了很多,最亲近的人只删除了其中一个对象。

添加代码:

public void add(Item... objects) {
    for(Item obj : objects) {
        inventory.put(obj.getKey(), obj);
    }
}

这里是getKey();

private String name;
private int value;
private String description;
private static Integer key = 0;
private Integer individualKey;
public Item(String name, int value, String description) {
    setName(name);
    setValue(value);
    setDescription(description);
    key++;
    individualKey = key;
}

还有更多

public Integer getKey() {
    return individualKey;
}

1 个答案:

答案 0 :(得分:0)

这可能有效,但是我首先要考虑使您的add方法阻止它,并弄清楚为什么使用HashMap而不是其他一些集合。

List<Item> al = new ArrayList<Item>(inv.values());

Set<Item> hs = new LinkedHashSet<>(al);

hs.addAll(al);
al.clear();
al.addAll(hs);
inv.clear()
for (Item i : hs) inv.put(i.getKey(),i);