2010-09-01 28 views
15

Tengo esta "lista" de entradas. Podría ser un Vector, int[], List<Integer>, lo que sea.Convertir una matriz int a una matriz de cadenas

Mi objetivo, sin embargo, es ordenar los datos y terminar con un String[]. Cómo comienza la matriz int como está en el aire.

ejemplo: Inicio con: {5,1,2,11,3} final con: String[] = {"1","2","3","5","11"}

¿Hay alguna forma de hacer esto sin un bucle? Tengo un bucle for ahora para recopilar los enteros. Preferiría omitir hacer otro ciclo for.

+2

favor RETAG su pregunta con el idioma apropiado. –

+5

¿Por qué quieres evitar los bucles? Cualquier solución que surja tendrá algún tipo de ciclo, incluso si está oculto detrás de una llamada a un método. –

+0

Dice "Esto es para Java", tiene una etiqueta de Java, y no se ha editado, ¡su comentario parece inútil! no creo que es posible completar esto sin un bucle (unos pocos realmente desde la clasificación sólo puede hacerse a través de algún tipo de proceso de bucle/iterativa). – Rudu

Respuesta

18
int[] nums = {5,1,2,11,3}; //List or Vector 
Arrays.sort(nums); //Collections.sort() for List,Vector 
String a=Arrays.toString(nums); //toString the List or Vector 
String ar[]=a.substring(1,a.length()-1).split(", "); 
System.out.println(Arrays.toString(ar)); 

UPDATE:

Una versión más corta:

int[] nums = {-5,1,2,11,3}; 
Arrays.sort(nums); 
String[] a=Arrays.toString(nums).split("[\\[\\]]")[1].split(", "); 
System.out.println(Arrays.toString(a)); 
+0

Creo que esta podría ser la respuesta. No quería volver a examinar la lista por segunda vez porque ya estoy iterando para obtener la lista int. Gracias. – ovaherenow

+1

si está preocupado por la velocidad, entonces es mejor usar el ciclo for normal una vez más porque en Arrays.toString() están utilizando un ciclo for. Compruebe la fuente (http://www.docjar.com/html/api/java) /util/Arrays.java.html) Pero si solo quiere que su código parezca pequeño, entonces está bien, puede usar el código anterior u otra opción es simplemente escribir una función pequeña para enviar un int [] como entrada y devolver una matriz String [] como salida. – Emil

+0

El "[\\ [\\]]" es una expresión regular, ¿verdad? ¿Cómo supiste cuál usar y qué es exactamente lo que dicta? – Chance

0

Puede usar Collections.sort() y luego iterar sobre la lista y recopilar String.valueOf() cada elemento.

http://download.oracle.com/javase/6/docs/api/java/util/Collections.html#sort%28java.util.List%29

para un vector, primero una lista con Collections.list(Enumeration e).

Para una matriz, debe utilizar Arrays.sort() en lugar de Collections.sort().

http://download.oracle.com/javase/6/docs/api/java/util/Arrays.html#sort%28int%5b%5d%29

+0

'Vector' is-a' List'. –

+0

Oh, sí lo es. No uso 'Vector' s tanto como son obsoletos, así que no sabía que se convirtieron en' List's. Recordé cuándo los iterarías con 'Vector.elements()' (hace mucho tiempo). – gpeche

+2

Vector, Hashtable, StringBuffer: Estas clases son un tanto obsoletas, pero la gente sigue usándolas. Gente nueva, también. Me pregunto de dónde sabrán que ... –

8

¿Puedo usar un bucle while en su lugar?

@Test 
public void test() { 
    int[] nums = {5,1,2,11,3}; 

    Arrays.sort(nums); 

    String[] stringNums = new String[nums.length]; 
    int i = 0; 
    while (i < nums.length) { 
     stringNums[i] = String.valueOf(nums[i++]); 
    } 

    Assert.assertArrayEquals(new String[]{"1","2","3","5","11"}, stringNums); 
} 

Usando JUnit assertions.

Lo siento, estoy siendo impertinente. Pero decir que no se puede usar un bucle for es tonto: tienes que iterar en la lista de alguna manera. Si va a llamar a un método de la biblioteca para ordenarlo por usted (cf Collections.sort()), eso hará que se repita de alguna manera sobre los elementos.

+0

¿dónde está la clasificación? –

+0

Lo siento, me adelanté. –

1

¿Qué tal algo como esto:

List<String> stringList = new ArrayList<String>(); 
List<Integer> list = new ArrayList<Integer>(Arrays.asList(5,1,2,11,3)); 
Collections.sort(list); 
Iterator<Integer> iterator = list.iterator(); 
while(iterator.hasNext()) { 
    stringList.add(iterator.next().toString()); 
} 
System.out.println(stringList); 
4

Si utiliza un TreeSet, tengo un (alargada) de una sola línea para usted (suponiendo items es el TreeSet):

final String[] arr = 
    items.toString() // string representation 
     .replaceAll("\\D+", " ") // replace all non digits with spaces 
     .trim() // trim ends 
     .split(" "); // split by spaces 

prueba código:

Set<Integer> items = new TreeSet<Integer>(Arrays.asList(5, 1, 2, 11, 3)); 

// insert above code here 

System.out.println(Arrays.toString(arr)); 

salida:

[1, 2, 3, 5, 11] 

EDIT:

OK, aquí es una versión diferente que funciona con la matriz int directamente. Pero lamentablemente no es de una sola línea.Sin embargo, lo hace mantener duplicados y es probable que sea más rápido

nuevo EDIT:

Bug fijo y los números negativos apoyado, conforme a lo solicitado:

EDITAR vez más: sólo un pase de expresiones regulares y ningún ajuste

final int[] in = { 5, 1, 2, 11, 3, 2, -5 }; // with duplicate 
    Arrays.sort(in); 
    final String[] out = 
     Arrays.toString(in) 
      .replaceAll("(?:\\[?)([-\\d]+)(?:\\]?)", "$1") // just remove [ and ] 
      .split("\\s*,\\s*"); // split by comma 

    System.out.println(Arrays.toString(out)); 

salida:

[-5, 1, 2, 2, 3, 5, 11] 

o completamente sin expresión regular (aparte de split()), pero con un paso más añadido:

final int[] in = { 5, 1, 2, 11, 3, 2, -5 }; // with duplicate 
Arrays.sort(in); 
final String stringRep = Arrays.toString(in); 
final String[] out = 
    stringRep.substring(1, stringRep.length() - 1).split("\\s*,\\s*"); 

System.out.println(Arrays.toString(out)); 

Salida:

[-5, 1, 2, 2, 3, 5, 11] 

Actualización: despojado espacios en blanco de mis dos últimas soluciones , espero que estés feliz ahora :-)

+1

Esto no funcionará correctamente para ninguna matriz o lista con más de 1 del mismo elemento. – ColinD

+0

+1 @ColinD. 'TreeSet' clasificará los números por usted, pero también eliminará los duplicados, que no es lo que se pretende. – missingfaktor

+0

Lo sé, pero nadie dijo nada acerca de mantener a los engañados –

3

Prefiero omitir hacer otra para loop.

Eso es tonto. Es un deseo tonto y una base tonta para emprender un ejercicio de código. Si puede expresar mejor las cualidades que desea que tenga su código, entonces tenemos algo de lo que hablar, que debería ser fácil de leer, decir, o realizar, o probar, o robusto. Pero "prefiero omitirlo" simplemente no nos da nada útil para trabajar.

+0

Porque ya hago un bucle para obtener la lista. Gracias por jugar sin embargo. – ovaherenow

5

solución simple usando Guava:

public List<String> toSortedStrings(List<Integer> ints) { 
    Collections.sort(ints); 
    return Lists.newArrayList(Iterables.transform(ints, 
     Functions.toStringFunction())); 
} 

Obviamente, esta solución (como cualquier otro) va a utilizar bucles internos, pero se pone fuera del código que tiene que leer. También puede evitar cambiar el orden en ints pasando primero el resultado de Ordering.natural().sortedCopy(ints) a transform en lugar de usar Collections.sort. Además, la parte Lists.newArrayList no es necesaria si no necesita poder agregar nuevos elementos a la lista resultante.

La versión abreviada de ese cuerpo método, con las importaciones estáticas:

return transform(Ordering.natural().sortedCopy(ints), toStringFunction()); 
3

Uso de Functional Java,

import fj.data.List; 
import static fj.data.List.*; 
import static fj.pre.Show.*; 
. 
. 
. 
final List<Integer> xs = list(5,1,2,11,3); 
final List<String> ys = xs.sort(Ord.intOrd).map(
    new F<Integer, String>() { 
    @Override public String f(final Integer i) { 
     return String.valueOf(i); 
    } 
    } 
); 
listShow(stringShow).println(ys); 
+1

¡eso es genial! (si tuviese votos restantes, lo rescindiría) :-) –

+0

@seanizer: Bueno, siempre puedes volver y votar. ;-) – missingfaktor

+1

Aquí está la Votación máxima ahora, como se prometió :-) –

0

¿Por qué no simplemente transfiere esos valores a String dentro del bucle for original, creando una matriz String en lugar de una matriz int? Suponiendo que está reuniendo su número entero inicial desde un punto inicial y añadiéndole cada iteración de bucle, la siguiente es una metodología simple para crear una matriz String en lugar de una matriz int.Si necesita ambas matrices int y String con los mismos valores, créelas en el mismo ciclo for y termine con ellas.

yourInt = someNumber; 

for (int a = 0; a < aLimit; a ++) { 

String stringName = String.valueOf(yourInt); 
StringArrayName[a] = stringName; 
yourInt ++; 

} 

O, si necesita tanto:

yourInt = someNumber; 

for (int a = 0; a < aLimit; a ++) { 

String stringName = String.valueOf(yourInt); 
StringArrayName[a] = stringName; 
intArrayName[a] = yourInt; 
yourInt ++; 

} 

Estoy de acuerdo con todos los demás. Los bucles son fáciles de construir, no requieren casi ninguna sobrecarga y son fáciles de seguir cuando se lee el código. Elegancia en la simplicidad!

+0

Hay algunos problemas con su código. 1. de todos, nadie usa un espacio en blanco en un ++ mientras que podría funcionar. ¡No intentes ser individual en el estilo de codificación! 2. ¿Qué es yourInt, someNumber? No existen en la pregunta, y usted no los declara ni los explica. 3. 'casting' es un término definido muy estrecho en Java. No hay conversión de String a Int, porque Int no es una subclase de String. 4. nadie usa 's [a] = String.valueOf (suInt);', pero 's [a] =" "+ suInt;'. 5. ¿Por qué la asignación intermedia a stringName? 6. ¿Por qué la violación de los estilos de codificación y el uso de StringArrayName [a] en lugar de stringArrayName [a]? –

+0

7. ¡Qué nombre, stringArrayName! Si bien es una matriz de enteros como nombres. 8. sin sangría. Todos esos problemas ocultan su idea simple, pero elegante, si es aplicable. –

-2

Arrays.sort (nums); var stringArray = (nums.toString()). Split (','). Map (String);

+1

No crea que Java tiene la palabra clave 'var'. Esto se ve como JavaScript –

7

Utilice un Stream que está disponible en Java 8. Para obtener una instancia Stream con "lista" de enteros:

  • Para int[]
    • IntStream intStream = Arrays.Stream(nums); o
    • Stream<Integer> intStream = Arrays.Stream(nums).boxed(); si necesita la misma clase como la inferior.
  • para cualquier clase de interfaz con Collection<Integer> (ex Vector<Integer>, List<Integer>.)
    • Stream<Integer> intStream = nums.stream();

Por último, para obtener un String[]:

String[] answer = intStream.sorted().mapToObj(String::valueOf).toArray(String[]::new); 
1

Uso Eclipse CollectionsMutableIntList:

String[] result = IntLists.mutable.with(5, 1, 2, 11, 3) 
     .sortThis() 
     .collect(Integer::toString) 
     .toArray(new String[]{}); 

Assert.assertArrayEquals(
     new String[]{"1", "2", "3", "5", "11"}, result); 

o el comercio de algunos legibilidad de la eficiencia potencial:

MutableIntList intList = IntLists.mutable.with(5, 1, 2, 11, 3).sortThis(); 
String[] result = intList.injectIntoWithIndex(
     new String[intList.size()], 
     (r, each, index) -> { 
      r[index] = Integer.toString(each); 
      return r; 
     }); 

Assert.assertArrayEquals(
     new String[]{"1", "2", "3", "5", "11"}, result); 

Nota: Soy un confirmador de Eclipse Colecciones

Cuestiones relacionadas