1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем Krongss_fur, 29 окт 2022.

  1. Автор темы
    Krongss_fur

    Krongss_fur Активный участник Пользователь

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

    Sturm_PT Активный участник Пользователь

    Баллы:
    76
    Мапа считает равенство через equals. Если у тебя не находит элементы, то, очевидно, они разные. Например, где-то могут быть заданы pitch/yaw или что-то ещё.
     
  3. Автор темы
    Krongss_fur

    Krongss_fur Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Krong
    pitch и yaw у обоих значений 0.0
     
  4. Автор темы
    Krongss_fur

    Krongss_fur Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Krong
    Я могу скинуть скрин, там выводит location.toString();. Или как мне проверить? Если должно быть это одинаковым значением?
     
  5. Sturm_PT

    Sturm_PT Активный участник Пользователь

    Баллы:
    76
    Значит, ещё что-то различается. Если метод equals даёт true - мапа локацию найдёт
     
  6. Sturm_PT

    Sturm_PT Активный участник Пользователь

    Баллы:
    76
    Проверить надо loc1.equals(loc2)
     
  7. Автор темы
    Krongss_fur

    Krongss_fur Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Krong
    И так, я кое что сделал, и смотрите что вышло:

    Код:
            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");
            }
    После этого мне выбивает в консольке:
     
  8. imDaniX

    imDaniX Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    imDaniX
    Покажи полный код, где проверяешь наличие локаций.
     
  9. Автор темы
    Krongss_fur

    Krongss_fur Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Krong
    при попытке:
    Код:
    system.out.println(Мапа.containsKey(loc));
    выводит false
     
  10. Sturm_PT

    Sturm_PT Активный участник Пользователь

    Баллы:
    76
    Такого не бывает. Неси полный код
     
  11. Автор темы
    Krongss_fur

    Krongss_fur Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Krong
    Код:
        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 + "Вы разрушили свою базу!");
                }
    
                }
            }
     
  12. Sturm_PT

    Sturm_PT Активный участник Пользователь

    Баллы:
    76
    Теперь код, где помещаешь значение в мапу
     
  13. Автор темы
    Krongss_fur

    Krongss_fur Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Krong
    Код:
    RegionToLoc.put(loc, regionInfo);
    loc - получаю с ивента когда ставят компоратор(BlockBreakEvent)
    regionInfo ооп класс с данными.
     
  14. Sturm_PT

    Sturm_PT Активный участник Пользователь

    Баллы:
    76
    Если equals даёт true - должно быть всё ок. Есть, конечно, вариант, что конкретно на твоём ядре криво определили hashCode у локации, но, по-моему, вероятность этого нулевая
     
  15. Автор темы
    Krongss_fur

    Krongss_fur Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Krong
    Почему же тогда такое происходит?Всё же правильнее через containsKey делать
     
  16. Sturm_PT

    Sturm_PT Активный участник Пользователь

    Баллы:
    76
    А чёрт его знает, тестить надо. Посмотри, не изменяется ли у тебя локация, которую ты в мапу суешь, посмотри, что будет, если найденную локацию удалить и ещё раз засунуть, и т.д.
     
  17. Автор темы
    Krongss_fur

    Krongss_fur Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Krong
    А вопрос такой, может ли повлиять такой момент, что в одном из значений было на 0,5 больше по y чем у другой локации, я про это уже упоминал т.к это компаратор и пол блока, и я просто вычитал 0,5 из этого y что получал значение.0
     
  18. deadanykey

    deadanykey Активный участник Пользователь

    Баллы:
    96
    А почему решили, что в мапу будет запихнута именно локация как ключ? А не ссылка ли на объект Loc? Тогда всё верно - не найдёт, потому что ссылка на Loc другая.
     
  19. Sturm_PT

    Sturm_PT Активный участник Пользователь

    Баллы:
    76
    Если ты сначала суёшь локу в мапу, а потом изменяешь её - да, по идее может не найти
     
  20. Sturm_PT

    Sturm_PT Активный участник Пользователь

    Баллы:
    76
    Collections работают через equals
     

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