2014-10-01 13 views
7

Mam 2 pliki tekstowe z danymi. Czytam te pliki z BufferReader i umieszczam dane jednej kolumny na pliku w List<String>.Jak uzyskać unikalne wartości na liście

Mam powielone dane w każdym z nich, ale muszę mieć niepowtarzalne dane w pierwszym List, aby skonfrontować się z powielonymi danymi w drugim List.

Jak uzyskać unikalne wartości z List?

+0

Nie dodawaj zduplikowanych wartości, jeśli lista zawiera 'zawiera()' to? –

Odpowiedz

7

Konwersja ArrayList na HashSet.

List<String> listWithDuplicates; // Your list containing duplicates 
Set<String> setWithUniqueValues = new HashSet<>(listWithDuplicates); 

Jeśli z jakiegoś powodu chcesz przekonwertować zestaw z powrotem na listę, możesz, ale najprawdopodobniej nie będzie potrzeby.

List<String> listWithUniqueValues = new ArrayList<>(setWithUniqueValues); 
+0

Dużo za odpowiedź. –

0

Po prostu zdaję sobie sprawę, że rozwiązanie może być pomocne dla innych osób. najpierw zostaną wypełnione zduplikowanymi wartościami z BufferReader.

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

Aby wydobyć unikalne wartości i po prostu stworzyć nową ArrayList jak puchu:

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

    for(String s : first) { 
     if(!otherList.contains(s)) 
      otherList.add(s); 
    } 

Wiele postu w internecie są mówiąc przypisać mój ArrayList do listy, zbiór, HashTable lub TreeSet. Czy ktoś może wyjaśnić różnicę w teorii i jaki jest najlepszy w praktyce? thnks za swój czas chłopaki.

+0

Dokumentacja interfejsu API języka Java zawiera rozbudowaną dokumentację dla każdej klasy kolekcji i interfejsów. [Strona Wiki na listach] (http://en.wikipedia.org/wiki/List_ (abstract_data_type)) zawiera także przegląd i linki do stron o innych typach kolekcji. –

13

mogą być wykonane jedną jednej linii, przy użyciu produktu pośredniego Set:

List<String> list = new ArrayList<>(new HashSet<>(list)); 

W Java 8, stosuje distinct() na temat strumienia:

List<String> list = list.stream().distinct().collect(Collectors.toList()); 

Alternatywnie, nie należy stosować w Lista wszystko; po prostu użyj Set (jak HashSet) od początku dla kolekcji, w której chcesz przechowywać tylko unikalne wartości.

+0

Myślę, że masz na myśli: 'list.stream(). Distinct(). Collect (Collectors.toList());' – MoGa

+0

@MoGa Byłem młody, głupi i zakochany. Kto może mnie obwiniać za takie szaleństwo? (dzięki - poprawiony kod) – Bohemian

+0

lol twój kod faktycznie wskazał mi właściwy kierunek;) – MoGa

0

W Javie 8:

 // List with duplicates 
    List<String> listAll = Arrays.asList("A", "A", "B", "C", "D", "D"); 

    // filter the distinct 
    List<String> distinctList = listAll.stream() 
        .distinct() 
        .collect(Collectors.toList()); 

    System.out.println(distinctList);// prints out: [A, B, C, D] 

ten będzie również pracować z obiektami, ale prawdopodobnie będzie musiał dostosować swoje metody równymi.

Powiązane problemy