2013-06-16 3 views
2

У меня есть ArrayList tmp_list, который может содержать повторяющиеся значения. Я хочу заполнить другой ArrayList filtered_tmp_list только одним вступлением каждого значения. Вот что я сделал:Получить уникальные/неповторяющиеся значения из списка

ArrayList<String> filtered_tmp_list = new ArrayList<String>(); 

filtered_tmp_list.add((String) tmp_list.get(0)); 

for(int i=0; i<tmp_list.size(); i++){ 
    String cmp = (String) tmp_list.get(i) ; 
    int doubled = 0; 
    for(int j=0; j<filtered_tmp_list.size(); j++){ 
     String cmpd = (String) tmp_list.get(j) ; 
     if(cmp.compareTo(cmpd)==0){ 
      doubled ++ ; 
     } 
    } 
    if(doubled==0) filtered_tmp_list.add(cmp); 
} 

Моя идея состояла в том, чтобы проверить, является ли значение -already в filtered_tmp_list - присутствует в tmp_list более чем один раз, если да, то я ничего не делать, в противном случае: если в два раза, равна нулю, это означает, что значения заслуживают вставки в filtered_tmp_list.

Ну, как вы можете ожидать, я здесь, потому что получаю повторяющиеся значения ... Что я пропустил?

Спасибо.

+0

CompareTo используется для заказа, а не для сравнивая равенство – Zavior

+0

Я знаю, но это не является основной проблемой на данный момент или не так ли? – Akheloes

+0

Что находится в 'tmp_list'? – johnchen902

ответ

3

Используйте Set затем List:

List<String> ret = new ArrayList<>(new HashSet<>(origList)); 

Set не может содержать повторяющиеся элементы; и HashSet используется с String, реализует .equals() и .hashCode().

Если вы хотите сохранить первоначальный порядок элементов в первоначальном списке, замените HashSet на LinkedHashSet.

(заполнить пустые алмазы с String, если это не Java 7)

Edit: см ответ @ ZeroCooL как к тому, что было неправильно с оригинальным кодом

+0

Обратите внимание, что это не сохраняет первоначальный порядок «Список». Если заказ не имеет значения, то это, безусловно, простое и эффективное решение. –

+0

@MattiasBuelens хорошая точка, отредактированный – fge

+0

Попробуйте прямо сейчас, спасибо! – Akheloes

1

Если вы беспокоитесь о порядке введения

List<String> ret = new ArrayList<String>(new LinkedHashSet<String>(origList)); 
+0

+1 за совет, спасибо! :) – Akheloes

+1

Uh, equals возвращает логическое значение! – fge

+0

yep, должно быть '! Cmp.равен (CMPD) '. – Akheloes

6

Здесь вы идете:

Replace below code it works: 

for(int j=0; j<filtered_tmp_list.size(); j++){ 
     **String cmpd = (String) filtered_tmp_list.get(j) ;** 
     if(cmp.compareTo(cmpd)==0){ 
      doubled ++ ; 
     } 
    } 
+1

Хорошее пятно! +1 – fge

+0

Ваша логика в порядке, я надеюсь, вы можете понять, где вы сделали ошибку из кода выше. – zerocool

+0

Извините, что опоздал, и да, я заметил, мне нужен крик, 90% моих трудностей с программированием исходит от опечаток или глупостей. Ну, +1 за хорошие глаза @zerocool, спасибо! – Akheloes

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