2015-08-03 4 views
0

Итак, у меня есть интерфейс.Удалить дублируемую запись из массива настраиваемых объектов

public interface ARecord { 
      public BigInteger getAutoID(); 
      public String getACompId(); 
    } 

и

public class APPPRecord extends AbstratAPRecord implements ARecord{ 
     private BigInteger autoID; 
     private String ACompId = null; 
     //setter and getter} 

В службе,

List<APPPRecord> PFRecord = null; 
    while(scroll.next()){ 
     APPPRecord item = (APPPRecord) scroll.get(0); 
     List<ARecord> recs = new ArrayList<ARecord>(); 
     unique(APPPRecord); 
     recs.addAll(APPPRecord); 

Мой РИК имеют повторяющиеся записи, которые я пытаюсь удалить, и есть одна уникальная записи для каждого дублированного recod. До сих пор я пробовал Set и hash set, но безрезультатно. Любая помощь приветствуется.

EDIT: Я пробовал хеш-код и равный.

@Override 
    public boolean equals(Object obj) { 
    if(obj instanceof APPPRecord) 
    { 
     APPPRecord temp = (APPPRecord) obj; 
     if(this.getACompId() == temp.getACompId()) 
      return true; 
    } 
    return false; 
} 
@Override 
public int hashCode() { 
    return (this.getACompId().hashCode());   
} 

в обслуживании:

private List<APPPRecord> unique(List<APPPRecord> list) { 
    List<APPPRecord> uniqueList = new ArrayList<APPPRecord>(); 
    Set<APPPRecord> uniqueSet = new HashSet<APPPRecord>(); 
    for (APPPRecord obj : list) { 
     if (uniqueSet.add(obj)) { 
      uniqueList.add(obj); 
     } 
    } 
    return uniqueList; 
} 
+0

Комплект должен работать. А что нет? Вы переопределили 'equals()' и 'hashcode()' в своем классе? –

+0

обновил мой вопрос. – Jay

ответ

0

Ах, хорошо. Вероятно, ваша ошибка:

if(this.getACompId() == temp.getACompId()) 

ACompId - это String. Вы не можете сравнивать строки с ==. Использование «равно» вместо:

if(this.getACompId().equals(temp.getACompId())) 

== сравнивает только личность, а это означает, что строка только == себя - но не ==equal строки. Для работы == они должны быть одним и тем же объектом, но «A» и «A» не обязательно должны быть. Они могут быть двумя разными объектами, которые имеют один и тот же контент.

Это легко попасть в эту ловушку, так как когда вы записываете его непосредственно ...

String x = "A"; 
String y = "A"; 
boolean same = x == y; // will probably be true, since the compiler can optimze it into the same object 

Но это, скорее всего, не работает для динамических строк, которые создаются во время выполнения. Итак, чтобы сделать его коротким, никогда не полагайтесь на «==» для сравнения «равно». Используйте только «==», если вы хотите сравнить «тот же объект» (который вы можете сделать в некоторых очень конкретных случаях, конечно - строки часто не являются одними из них).

+0

Спасибо, что нашли время ответить. Я тоже пробовал это, но я все еще вижу повторяющиеся результаты. – Jay

+0

Ну, код службы делает то, что ожидается, попробовал его с помощью Integer. –

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