2014-12-18 3 views
0

Я не могу получить эти объекты из ArrayList Я думаю, что ArrayList использует метод equals и метод hashCode, поэтому я что-то пропускаю? Это мой объектКак работает индекс ArrayList?

public class OPCode { 

public String code; 

public OPCode(String code){  

    this.code = code;  
} 

@Override 
public boolean equals(Object o){ 
OPCode c = (OPCode) o; 
return this.code.equals(c.code.substring(0, c.code.length()-2)); // returns ture 
} 

@Override 
public int hashCode() { 
    return 1; 
} 
} 

и и пример

ArrayList<OPCode> t_codes = new ArrayList(); 
OPCode c = new OPCode("1-202"); 
    t_codes.add(c); 
    OPCode e = new OPCode("1-202.0"); 
    t_codes.indexOf(e); // -1 <-- Problem here 
    t_codes.indexOf(c) // finds it 

Я хочу е и с равными.

+0

возможно дубликат [Как сравнить строки в Java?] (Http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java) – Joe

+0

так, как я видеть это. Вам эфир нужно переопределить equals на OPCode или использовать объект-оболочку, у которого есть метод переопределенных равных – AppX

+0

, очевидно, не дубликат того, как сравнивать строки. – kai

ответ

1

Вы не добавили элемент в список t_codes.add(e);

t_codes.indexOf(c) // finds it работает, потому что вы добавили этот объект в список t_codes.add(c);

Но вы еще не добавили объект OPCode e = new OPCode("1-202.0"); к списку. Поэтому t_codes.indexOf(e); дает вам -1

+0

@downvoter Мне любопытно узнать причину, пожалуйста. – gprathour

+1

Я не дубликатор, но ваш ответ не решает проблему OPs. Наверное, поэтому вы урезаны. – Tom

+0

@ Тома. Хорошо, но я думаю, что у ОП возникла проблема, потому что он забыл добавить второй объект в список. – gprathour

0

Если вы работаете с Eclipse. Выберите метод и нажмите F3 (требуется jdk). Теперь вы увидите реализацию:

/** 
* Returns the index of the first occurrence of the specified element 
* in this list, or -1 if this list does not contain the element. 
* More formally, returns the lowest index <tt>i</tt> such that 
* <tt>(o==null&nbsp;?&nbsp;get(i)==null&nbsp;:&nbsp;o.equals(get(i)))</tt>, 
* or -1 if there is no such index. 
*/ 
public int indexOf(Object o) { 
    if (o == null) { 
     for (int i = 0; i < size; i++) 
      if (elementData[i]==null) 
       return i; 
    } else { 
     for (int i = 0; i < size; i++) 
      if (o.equals(elementData[i])) 
       return i; 
    } 
    return -1; 
} 
0

Проблема с вашим методом равна.

t_codes.indexOf(c) на самом деле относится к object e. Поскольку в соответствии с вашим методом равных методов, e равен c, но наоборот это неверно.

e.equals(c) != c.equals(e). Вы должны пересмотреть равную реализацию.

0

Ваш метод equals() не является коммутативным. То есть e.equals(c) != c.equals(e), так что не удивительно, что вы получаете странное поведение.

1

Ваши неправильные методы equals() и hashCode(). Вы нарушаете договор.

Если я правильно понял, вы хотите, чтобы найти индекс e хотя есть только в списке c, и вы хотите сделать это злоупотребление String#equals() проверки равенства только для первых 5 букв. Таким образом, c.code = 1-202, e.code = 1-202.0, делает c.code.equals(e.code.subString(0, e.code.lenght()-2)) должен содержать true.

Это правильная реализация:

public class OPCode { 

    public String code; 

    public OPCode(String code){  

     this.code = code;  
    } 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((code == null) ? 0 : code.split("\\.")[0].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; 
     OPCode other = (OPCode) obj; 
     if (code == null) { 
      if (other.code != null) 
       return false; 
     } else{ 
      String thisCode = code.split("\\.")[0]; 
      String otherCode = other.code.split("\\.")[0]; 
      if (!thisCode.equals(otherCode)) 
       return false; 
     } 
     return true; 
    } 
} 

Обратите внимание, что я использовал метод String#split поскольку (и это мое предположение), вы хотите быть одинаковые коды с той же числовой части без учета дробной части. Используя split, мы избегаем управления переменным числом литералов.

испытание его:

ArrayList<OPCode> t_codes = new ArrayList<OPCode>(); 
OPCode c = new OPCode("1-202"); 
t_codes.add(c); 
OPCode e = new OPCode("1-202.0"); 
System.out.println(t_codes.indexOf(e)); // -1 <-- Problem here now gives 0 
System.out.println(t_codes.indexOf(c)); 

КСТАТИ Я создал как метод, используя затмение встроенного функции через Source> Создать хэш-код() и Equals() ... и модифицированные для выполнения этой задачи.

0

Проблема с вашим методом равных.

return (c.code.equals(code)) || c.code.equals(this.code.substring(0, this.code.length() - 2));