2009-12-08 11 views
5

W języku Java, w jaki sposób przekonwertować tablicę ciągów na tablicę unikatowych wartości?Jak przekonwertować tablicę łańcuchów na tablicę unikatowych wartości?

Jeśli mam tej tablicy ciągów:

String[] test = {"1","1","1","2"} 

I chcę skończyć z:

String[] uq = {"1","2"} 
+0

Użyj zmodyfikowanego Mergesort, usuwając duplikaty w kura napotkała, zamiast dodawać obie kopie z powrotem do listy. Działa w trybie '' O (N * logN) '** –

Odpowiedz

2

Jeśli masz zamiar z HashSet, podejściem (co wydaje się dość poręczny) należy użyć LinkedHashSet zamiast HashSet jeśli chcesz utrzymać porządek tablicy głównej!

1

Łatwym sposobem jest stworzenie zestawu, dodać każdy element w tablicy do it, a następnie przekonwertuj zestaw na tablicę.

1
List list = Arrays.asList(test); 
Set set = new HashSet(list); 

String[] uq = set.toArray(); 
+0

Byłoby łatwiej wywołać' Set.toArray() '. –

+0

Tak, przez chwilę wybieram na dłuższą metę nie wiem dlaczego –

13

Krótki ale nieco nieskuteczny sposób byłoby:

Set<String> temp = new HashSet<String>(Arrays.asList(test)); 
String[] uq = temp.toArray(new String[temp.size()]); 
+0

Dlaczego jest to nieefektywne? Biorąc pod uwagę macierz prawdopodobnie ma więcej niż cztery wartości. Alternatywą jest posortowanie tablicy i szukanie dupków, prawda? –

2
String[] test = {"1","1","1","2"}; 
java.util.Set result = new java.util.HashSet(java.util.Arrays.asList(test)); 
System.out.println(result); 
+0

Część "" + nie jest wymagana, System.out.println (result) to wszystko, czego potrzeba. – daveb

+0

Dobrze, spieszył się :) – maximdim

2

Alternatywą dla podejścia Hashset byłoby:

  1. sortowania tablicy wejście

  2. Policz liczbę o f nieduplikowanych wartości w sortowanej tablicy

  3. przydzielenia macierz wynikową

  4. iteracyjnego posortowanej tablicy kopiowania nieduplikowanych wartości do niego.

Podejście HashSet jest O(N) średnio przy założeniu, że 1) przydzielenia do HashSet o odpowiednim rozmiarze i 2) (nieduplikowanych) Wartości w tablicy mieszania wejściowy w przybliżeniu równomiernie. (Ale jeśli wartość mieszania jest patologiczna, najgorszy przypadek to O(N**2)!)

Podejście do sortowania wynosi średnio O(NlogN).

Podejście HashSet zajmuje średnio więcej pamięci.

Jeśli robisz to rzadko OR dla naprawdę dużych "dobrze zachowanych" tablic wejściowych, podejście HashSet jest prawdopodobnie lepsze. W przeciwnym razie może to być podejście, które jest lepsze.

2

Próbowałem wszystkich odpowiedzi na tej stronie i żaden nie działał tak jak jest.Tak, o to w jaki sposób rozwiązać go, inspirowany odpowiedzi od Taig i akuhn:

import groovy.io.*; 
def arr = ["5", "5", "7", "6", "7", "8", "0"] 
List<String> uniqueList = new ArrayList<String>( 
     new LinkedHashSet<String>(arr.asList()).sort()); 
System.out.println(uniqueList) 
0

tu jest moje rozwiązanie:

int[] A = {2, 1, 2, 0, 1}; 

Arrays.sort(A); 

ArrayList<Integer> B = new ArrayList<Integer>(); 

for (int i = 0; i < A.length; i++) { 
if (i == A.length-1) { 
    B.add(A[i]); 
} 
else if (A[i] != A[i+1]) { 
    B.add(A[i]); 
} 
} 
0
String[] getDistinctElementsArray(String[] arr){ 

    StringBuilder distStrings = new StringBuilder(); 
    distStrings.append(arr[0] + " "); 
    for(int i=1;i<arr.length;i++){ 
     if(arr[i].equals(arr[i-1])){} 
     else{ 
      distStrings.append(arr[i] + " "); 
     } 
    } 
    return distStrings.toString().split(" "); 
} 
0

Wystarczy znaleźć ładniejszy sposób Java 8:

Arrays.stream(aList).distinct().toArray(String[]::new) 
Powiązane problemy