2017-02-17 1 views
3

У меня есть карта в Java, как так,Сравнивая запись в карте с объектом

private HashMap<String, Object[][]> theMap; 

Если ключ является строка, а запись будет что-то вдоль линии,

theMap = new HashMap<>(); 

Object[][] theData = { 
    {Boolean.FALSE, "Text"} 
}; 

theMap.put("Key1", theData); 

Где-то вдоль линии я хотел бы проверить, соответствует ли запись на карте другому объекту. В настоящее время я делаю это так:

Object[][] tempData = { 
    {Boolean.FALSE, "Text"} 
}; 

for(Object key: entries.keySet()) { 
    if(entries.get(key).equals(tempData)) { 
     entries.remove(key); 
    } 
} 

И он не работает.

Я предпочел бы, чтобы сравнение проводилось с объектом, а не с другой картой. Мне интересно, что я делаю неправильно с этим сравнением здесь?

+2

В основном проблема здесь для сравнения двух 2D массивов, вы можете использовать это: Arrays.deepEquals (массив1 массив2); –

+0

И для цикла for используйте значения вместо ключей. (Для (Object value: entries.values ​​()) Делает очиститель кода –

+0

Кстати, поскольку вы удаляете записи, как вы, возможно, вы должны использовать Итератор. –

ответ

3

Причина, по которой вы не получаете равенство, состоит в том, что массивы наследуют Object#equals(), который основан на идентичности, а не на равенстве содержания. Вы можете рассмотреть возможность использования java.util.Arrays.deepEquals(Object[], Object[]) для сравнения.

Это ответ на ближайший вопрос. Однако использование 2-мерного массива Object для хранения boolean и String - действительно плохой запах кода и указывает, что вам нужно инкапсулировать то, что вы помещаете в массив.

+0

Это сделало решите мою проблему, спасибо. И что бы вы предложили изменить, как я держусь за свои данные, отличные от объекта? – Kyleryan19

+0

Да, но это потребует понимания того, что вы пытаетесь сохранить на карте, чтобы создать соответствующий класс. Сделайте это сами и не забудьте реализовать 'hashCode()' и 'equals()' соответственно. Если у вас возникнут проблемы с этим, задайте новый вопрос. –

1

Идентичность против Эквивалентности

Пожалуйста, убедитесь, что вы понимаете, что по умолчанию equals() метода Object чеков ли две ссылки на объекты со ссылкой на тот же объект (идентичности), который не то, что ваши код проверяется.

Вместо этого ваш код проверяет, имеют ли два объекта (значения, которые вы положили на карту), одинаковое значение (эквивалентность).

Вот две статьи об этой теме:

  1. What is the difference between identity and equality in OOP?
  2. Overriding equals method in Java

В этой конкретной проблемы вашей, я думаю, что решение включает в себя два этапа:

  1. Ваши tempData и theData do es, похоже, не является массивом элементов того же типа (он не представляется двумерным массивом ). Вместо этого он содержит значение Boolean, а затем значение String. В этом случае, я думаю, что вы действительно должны думать через то, что эта штуковина есть и создать класс для него (я показываю пример ниже)
  2. Класс должен переопределить equals()hashCode()) методы , так что вы можете используйте его equals() для проверки эквивалентности.

Заметим также, что ваш IDE (например, Eclipse), вероятно, может создать шаблон для equals() и hashCode() для вас.

Пример: (здесь я предполагаю, что ваш Boolean представляет собой состояние, и ваш String представляет сообщение)

class MyRecord { 
    private Boolean condition; 
    private String message; 
    public Boolean getCondition() { 
     return condition; 
    } 
    public void setCondition(Boolean condition) { 
     this.condition = condition; 
    } 
    public String getMessage() { 
     return message; 
    } 
    public void setMessage(String message) { 
     this.message = message; 
    } 
    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result 
       + ((condition == null) ? 0 : condition.hashCode()); 
     result = prime * result 
       + ((message == null) ? 0 : message.hashCode()); 
     return result; 
    } 
    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     MyRecord other = (MyRecord) obj; 
     if (condition == null) { 
      if (other.condition != null) 
       return false; 
     } else if (!condition.equals(other.condition)) 
      return false; 
     if (message == null) { 
      if (other.message != null) 
       return false; 
     } else if (!message.equals(other.message)) 
      return false; 
     return true; 
    } 
} 
+0

Это намного больше, чем клиент просит lol. –

Смежные вопросы