2009-12-08 27 views
5

En Java, ¿cómo convierto una matriz de cadenas a una matriz de valores únicos?¿Cómo convierto una matriz de cadenas a una matriz de valores únicos?

Si tengo este array de Strings:

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

Y quiero terminar con:

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

Utilice Mergesort modificado, eliminando los duplicados w que encontró, en lugar de agregar ambas copias a la lista. Se ejecuta en ** 'O (N * logN)' ** –

Respuesta

2

Si va con el enfoque HashSet (que parece bastante útil) debe usar un LinkedHashSet en lugar de un HashSet si desea mantener el orden de la matriz.

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

Una manera fácil es crear un conjunto, agregue cada elemento de la matriz de y luego convertir el conjunto a una matriz.

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

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

Sería más fácil llamar a 'Set.toArray()'. –

+0

Sí, por un momento, elijo la manera loooong no sé por qué –

13

manera rápida pero algo ineficaz sería:

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

¿Por qué es ineficiente? Teniendo en cuenta que la matriz probablemente tiene más de cuatro valores. La alternativa es ordenar la matriz y buscar a los incautos, ¿verdad? –

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

La parte "" + no es necesaria, System.out.println (result) es todo lo que se necesita. – daveb

+0

Derecha, tenía prisa :) – maximdim

2

Una alternativa al enfoque HashSet sería:

  1. Ordenar la matriz de entrada

  2. Cuenta el número o valores no duplicados f en la matriz ordenada

  3. asignar la matriz de salida

  4. iterar sobre la matriz ordenada, la copia de los valores no duplicados a ella.

El enfoque HashSet es O(N) en promedio suponiendo que 1) que asignar previamente la HashSet con el tamaño correcto y los valores 2) la (no duplicados) en el hash matriz de entrada más o menos uniformemente. (Pero si el valor hash es patológico, el peor caso es O(N**2))

El método de clasificación es O(NlogN) en promedio.

El enfoque HashSet requiere más memoria en promedio.

Si está haciendo esto con poca frecuencia O para arreglos de entrada "bien comportados" realmente grandes, el enfoque HashSet es probablemente mejor. De lo contrario, podría ser un lanzamiento, que enfoque es mejor.

2

He intentado todas las respuestas en esta página y ninguna ha funcionado como está.Así pues, aquí es cómo lo resolví, inspirado en las respuestas de Taig y 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

aquí está mi solución:

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

acaba de encontrar una manera más agradable de Java 8:

Arrays.stream(aList).distinct().toArray(String[]::new) 
Cuestiones relacionadas