HashMap值和变量值匹配,但不认为是相等的

时间:2014-07-22 19:50:56

标签: java hashmap minecraft bukkit

我有一个方法,每当玩家右键单击一个胸部(Minecraft项目)时调用该方法,并且如果该块的位置与HashMap中的一个值匹配,则应检查该玩家的用户名是否与该键匹配在HashMap中。简单地说:这个位置是否已保存,并且尝试与之交互的玩家是否拥有它?我的if语句用于检查播放器和位置是否匹配无效。

有问题的一行:

if (DeathChestManager.deathChestLocation.get(playerName) == b.getLocation()) {}

HashMap和block(b)位置值(`println()输出的内容):

HashMap值:

Location{world=CraftWorld{name=world},x=59.0,y=64.0,z=-30.0,pitch=0.0,yaw=0.0}

阻止位置值:

Location{world=CraftWorld{name=world},x=59.0,y=64.0,z=-30.0,pitch=0.0,yaw=0.0}

来自DeathChestManager类的HashMap:

public static Map<String, Location> deathChestLocation = new HashMap<String, Location>();

PlayerInteract Class:

public void onPlayerInteract(PlayerInteractEvent e) {
        Player p = e.getPlayer();
        String playerName = p.getName();
        Block b = e.getClickedBlock();

        if (b != null && b.getType() == Material.CHEST) {
            if (DeathChestManager.deathChestLocation.containsValue(b.getLocation())) {
                e.setCancelled(true);

                System.out.println(DeathChestManager.deathChestLocation.get(playerName));
                System.out.println(b.getLocation());

                if (DeathChestManager.deathChestLocation.get(playerName) == b.getLocation()) {
                    if (e.getAction() == Action.RIGHT_CLICK_BLOCK) {
                        b.setType(Material.AIR);
                        Location loc = p.getLocation();
                        for (final ItemStack item : DeathChestManager.inventoryContents.get(p.getName())) {
                            int count = 0;
                            for (ItemStack i : p.getInventory().getContents()) {
                                if (i == null) {
                                    count++;
                                } else if (i.getType() == Material.AIR) {
                                    count++;
                                }
                            }
                            if (count == 0) {
                                if (item.getType() != Material.AIR) {
                                    p.getWorld().dropItemNaturally(loc, item);
                                }
                            } else {
                                if (item != null) {
                                    p.getInventory().addItem(item);
                                    p.updateInventory();
                                }
                            }
                        }
                        DeathChestManager dcManager = new DeathChestManager();
                        dcManager.endTimer(p, p.getWorld().getName());
                    }
                } else {
                    MessageManager.getInstance().severe(p, "You do not own that death-chest.");
                }
            }
        }
    }

3 个答案:

答案 0 :(得分:2)

比较对象时使用.equals()而不是====将比较内存中对象的地址,而.equals()将检查它们是否具有相同的值。由于两个对象很少具有相同的地址,所以除了比较基本类型(int,char,但String 不是基本类型!)之外,你不应该使用==。物质

所以你想要:

if (DeathChestManager.deathChestLocation.get(playerName).equals(b.getLocation())) {}

答案 1 :(得分:1)

您正在比较对象引用。只有当它们都引用相同的实例时,才会返回true。 如果您想比较这些对象的内容,请使用.equals()

答案 2 :(得分:1)

在测试基元以外的任何内容(int,boolean等)时,应该使用.equals(),而不是==。这包括字符串。