2009-12-08 13 views
5

In Java, wie konvertiere ich ein Array von Zeichenfolgen in ein Array von eindeutigen Werten?Wie konvertiere ich ein Array von Strings in ein Array von eindeutigen Werten?

Wenn ich dieses Array von Strings:

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

Und ich möchte am Ende mit:

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

Verwenden Sie modifizierten Mergesort, Entfernen von Duplikaten w gefunden, anstatt beide Kopien zur Liste hinzuzufügen. Läuft in ** 'O (N * logN)' ** –

Antwort

2

Wenn Sie mit dem HashSet-Ansatz (der ziemlich praktisch zu sein scheint) gehen, sollten Sie einen LinkedHashSet anstelle von HashSet verwenden, wenn Sie die Reihenfolge des Arrays beibehalten möchten!

Set<String> temp = new LinkedHashSet<String>(Arrays.asList(array)); 
String[] result = temp.toArray(new String[temp.size()]); 
1

Eine einfache Möglichkeit ist, einen Satz zu erstellen, fügen Sie jedes Element in dem Array es und konvertieren Sie dann die Menge in ein Array.

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

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

Es wäre einfacher 'Set.toArray()' aufzurufen. –

+0

Yeah für einen Moment wähle ich den laaaaaaaa weg weiß nicht warum –

13

schnell, aber etwas ineffizient wäre:

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

Warum ist es ineffizient? Angesichts der Array hat wahrscheinlich mehr als vier Werte. Die Alternative ist, das Array zu sortieren und nach Dupes zu suchen, nicht wahr? –

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

Der Teil "" + ist nicht erforderlich, System.out.println (Ergebnis) ist alles was benötigt wird. – daveb

+0

Richtig, war in Eile :) – maximdim

2

Eine Alternative zu dem HashSet Ansatz wäre:

  1. Sortieren der Eingangsanordnung

  2. Zählen Sie die Zahl o f nicht-doppelte Werte in der sortierten Array

  3. Ordnen der Ausgang Array

  4. Iterieren über die sortierten Array, das Kopieren der nicht-doppelte Werte zu.

HashSet Der Ansatz ist O(N) im Durchschnitt unter der Annahme, daß 1) man die HashSet mit der richtigen Größe vorzuzubelegen und 2) der (nicht duplicate) Werte in dem Eingangsfeld hash etwa gleichmäßig. (Aber wenn der Wert Hashing ist pathologisch, der schlimmste Fall ist O(N**2)!)

Der Sortieransatz ist O(NlogN) im Durchschnitt.

Der HashSet-Ansatz benötigt durchschnittlich mehr Speicher.

Wenn Sie dies selten OR für wirklich große "gut erzogene" Eingabe-Arrays tun, ist der HashSet-Ansatz wahrscheinlich besser. Sonst könnte es ein Toss-Up sein, welcher Ansatz besser ist.

2

Ich habe versucht alle Antworten auf dieser Seite und keiner arbeitete wie es ist.So, hier ist, wie ich es gelöst, inspiriert durch die Antworten von Taig und 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

hier ist meine Lösung:

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

gefunden Nur eine schönere Art und Weise in Java 8:

Arrays.stream(aList).distinct().toArray(String[]::new) 
Verwandte Themen