2013-03-21 2 views
1

У меня есть 2 списка токенов и аккордов. Они заселены хорошо. Но когда я пытаюсь сравнить 2, они всегда приносят ложное значение, несмотря на то, что печатают одинаковое строковое содержимое при печати отдельно в цикле. Любые идеи/обходные пути?Сравнение элементов списка в java

System.out.println(token.get(i).toString().equals(chords.get(j).toString())); 

Оба объявлены как List и инициализированы как ArrayList();

Оба содержат объекты String.

while (i < tokenLength) { 
    System.out.println(""); 
    int j = 0; 
    while (j < numberOfChords) { 
     System.out.println(token.get(i).toString() + " compares " 
       + chords.get(j).toString()); 
     System.out.println(token.get(i).toString() 
       .equals(chords.get(j).toString())); 
     if (token.get(i).toString() == chords.get(j).toString() 
       && token.get(i).toString().length() <= maxLengthOfChord) { 

      foundChord.add(token.get(i)); 
     } 
     j++; 
    } 
    i++; 
} 

дает следующий результат: enter image description here

Я также попытался это

System.out.println(token.get(i).toString().equals(chords.get(j).toString())); 

Это всегда дает ложное возвращение такой же результат, как показано на скриншоте

+6

Просьба показать две идентичные строки (не забывая о каких-либо ведущих/конечных пробелах и т. Д.). – NPE

+0

Также trim() ваши строки ... – Pragnani

+2

Если оба являются строками, тогда какая точка 'toString()' вызывает оба. –

ответ

1

Не могу сказать, почему он печатает ложь, но это определенно не так:

if (token.get(i).toString() == chords.get(j).toString() 

Изменить эту строку в

if (token.get(i).trim().equals(chords.get(j).trim()) 

равенства (равенства()) не совпадает с идентификатором (==).

+0

Пробовал. Без изменений результатов. – harsh8888

+1

С отделкой()? –

+0

.trim работал :-) Глупо меня! :-D – harsh8888

0

ToString () будет по умолчанию печатать хэш-код объекта. Этот hashcode является уникальным для всех объектов и, следовательно, он никогда не совпадает с hashcode других объектов, и результат является ложным при сравнении их (даже если объекты похожи). Чтобы получить ожидаемый результат, вам необходимо переопределить метод toString(). Может быть, вы можете возвращать значения переменных экземпляра из метода ToString

+2

OP сказал, что списки содержат объекты String. 'toString()' объекта 'String' вернет значение этого объекта. 'equals' будет сравнивать строки, используя их значения, чтобы этот код работал нормально. – Pshemo

+1

'toString()' объекта 'String' не возвращает хэш-код. См. Http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#toString() –

+0

Да, это правильно, потому что класс String переопределяет реализацию по умолчанию toString(), но обычно большая часть классы dont и, следовательно, возвращают hashcode –

2

Вы сделали все, вплоть до этого момента:

if (token.get(i).toString() == chords.get(j).toString() 

Вы должны использовать equals метод, а не ==

1

Это будет сравнивать ссылки не ценности.

token.get(i).toString() == chords.get(j).toString() 

Вы должны сделать:

token.get(i).toString().equals(chords.get(j).toString()) 
1

я не уверен, что именно проблема с текущим кодом, но я сделал вам одолжение упрощения это немного ...

for (String t : token) { 
    for (String c : chords) { 
    System.out.println(t + " compares " + c); 
    System.out.println(t.equals(c)); 
    if (t.equals(c)) { 
     foundChord.add(t); 
    } 
    } 
} 

Если я правильно понимаю, что вы должны делать то, что ваш текущий код пытается достичь, и он должен работать без ошибок.

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