Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите Почему не находит в HashMap локацию?

Krongss_fur

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
Krong
Привет. Через метод containsKey в HashMap пробую узнать, есть ли такая локация в мапе, записываю локацию в мапу через
Код:
RegionToLoc.put(loc, regionInfo);
loc - получаю через ивент
BlockBreakEvent. У локации может быть только один тип блока - компаратор. Код не выполняется любой хотя в мапе есть локация которая нужна, с помощью System.out.println() вывожу координаты блока которые ломают(это же loc) и вывожу данные из hashmap, значения почти одинаковые, но по высоте там на 0.5 меньше(потому что это не блок, а пол блока), что же я делаю, у loc просто уменьшаю значение y на 0.5 и пробую заново, координаты у обоих этих выведенных значений одинаковы полностью, а всё равно не выполняется код(пробовал что бы просто в консоль писало что угодно если присутствует в мапе локация такая). Может надо побольше информации, если да - пишите, надеюсь поможете в моей проблеме.
 
Мапа считает равенство через equals. Если у тебя не находит элементы, то, очевидно, они разные. Например, где-то могут быть заданы pitch/yaw или что-то ещё.
 
Мапа считает равенство через equals. Если у тебя не находит элементы, то, очевидно, они разные. Например, где-то могут быть заданы pitch/yaw или что-то ещё.
pitch и yaw у обоих значений 0.0
 
Мапа считает равенство через equals. Если у тебя не находит элементы, то, очевидно, они разные. Например, где-то могут быть заданы pitch/yaw или что-то ещё.
Я могу скинуть скрин, там выводит location.toString();. Или как мне проверить? Если должно быть это одинаковым значением?
 
И так, я кое что сделал, и смотрите что вышло:

Код:
        for(Location locs : RegionsLocation.keySet()){
            System.out.println(locs.equals(loc));
            System.out.println(loc.toString() + " Coordinated");
            System.out.println(locs.toString() + " Coordinated to location hashmap");
        }

После этого мне выбивает в консольке:
[14:36:11 INFO]: true
[14:36:11 INFO]: Location{world=CraftWorld{name=world},x=-112.0,y=49.5,z=99.0,pitch=0.0,yaw=0.0} Coordinated
[14:36:11 INFO]: Location{world=CraftWorld{name=world},x=-112.0,y=49.5,z=99.0,pitch=0.0,yaw=0.0} Coordinated to location hashmap
 
Покажи полный код, где проверяешь наличие локаций.
 
при попытке:
Код:
system.out.println(Мапа.containsKey(loc));
выводит false
 
Покажи полный код, где проверяешь наличие локаций.
Код:
    public void DeleteRegion(Player plr, Location loc){
        HashMap<Location, RegionInfo> RegionsLocation = pl.RegionToLoc;
        double y = loc.getY();
        y = y - 0.5;
        loc.setY(y);
        HashMap<UUID, RegionInfo> Regions = pl.RegionsList;
        for(Location locs : RegionsLocation.keySet()){
            System.out.println(locs.equals(loc));
            System.out.println(loc.toString() + " Coordinated");
            System.out.println(locs.toString() + " Coordinated to location hashmap");
        }

        System.out.println(RegionsLocation.containsKey(loc));
        if(RegionsLocation.containsKey(loc)){
                RegionInfo rg = RegionsLocation.get(loc);
            System.out.println("Executed");
            System.out.println(loc.toString() + " Coordinated");
            System.out.println(RegionsLocation.toString() + " Locations to region");
            System.out.println(Regions.toString() + "Regions");
            if(rg.getOwnerName().equals(plr.getName().toString())){

                rg.DeleteHologram();
                RegionsLocation.remove(loc, rg);
                Regions.remove(plr.getUniqueId(), rg);
                plr.sendMessage(ChatColor.YELLOW + "Вы разрушили свою базу!");
            }

            }
        }
 
Код:
RegionToLoc.put(loc, regionInfo);
loc - получаю с ивента когда ставят компоратор(BlockBreakEvent)
regionInfo ооп класс с данными.
Если equals даёт true - должно быть всё ок. Есть, конечно, вариант, что конкретно на твоём ядре криво определили hashCode у локации, но, по-моему, вероятность этого нулевая
 
Если equals даёт true - должно быть всё ок. Есть, конечно, вариант, что конкретно на твоём ядре криво определили hashCode у локации, но, по-моему, вероятность этого нулевая
Почему же тогда такое происходит?Всё же правильнее через containsKey делать
 
Почему же тогда такое происходит?Всё же правильнее через containsKey делать
А чёрт его знает, тестить надо. Посмотри, не изменяется ли у тебя локация, которую ты в мапу суешь, посмотри, что будет, если найденную локацию удалить и ещё раз засунуть, и т.д.
 
А чёрт его знает, тестить надо. Посмотри, не изменяется ли у тебя локация, которую ты в мапу суешь, посмотри, что будет, если найденную локацию удалить и ещё раз засунуть, и т.д.
А вопрос такой, может ли повлиять такой момент, что в одном из значений было на 0,5 больше по y чем у другой локации, я про это уже упоминал т.к это компаратор и пол блока, и я просто вычитал 0,5 из этого y что получал значение.0
 
А почему решили, что в мапу будет запихнута именно локация как ключ? А не ссылка ли на объект Loc? Тогда всё верно - не найдёт, потому что ссылка на Loc другая.
 
А вопрос такой, может ли повлиять такой момент, что в одном из значений было на 0,5 больше по y чем у другой локации, я про это уже упоминал т.к это компаратор и пол блока, и я просто вычитал 0,5 из этого y что получал значение.0
Если ты сначала суёшь локу в мапу, а потом изменяешь её - да, по идее может не найти
 
А почему решили, что в мапу будет запихнута именно локация как ключ? А не ссылка ли на объект Loc? Тогда всё верно - не найдёт, потому что ссылка на Loc другая.
Collections работают через equals
 

Поделиться этой страницей

Назад
Верх