0

Quiero recorrer un arreglo de números y en base al número contenido en cada índice del arreglo asignar un nombre en otro arreglo de caracteres.
Ejemplo:

public class NewClass {

public String[] lector(int arreglo[])
{
    String[] ciudades = null;

    for (int i : arreglo) {
        switch(i) {
            case 1:
                ciudades[i] = "New York";
                break;
            case 2:
                ciudades[i] = "Tokio";
                break;
            case 3:
                ciudades[i] = "Moscú";
                break;
        }
    }

    return ciudades;
}

public static void main(String[] args) {
    // TODO code application logic here

    int[] a = new int[2];
    a[0] = 1;
    a[1] = 3;

    NewClass nc = new NewClass();

    String[] b = nc.lector(a);

    for (String mostrar : b) {
        System.out.println(mostrar);
    }

}} 

Al imprimir en pantalla debería de imprimir "New york" y "Moscú" ([1][3] respectivamente).

Añadido: La idea es que si envío un arreglo int[] de largo 20, en los cuales todos vayan a contener un número entre 1 y 3, el método devuelva un arreglo String[] del mismo largo, habiendo escrito los nombres de las ciudades en reemplazo de los números.

Espero alguien sepa ayudarme con este problema, decir si lo que estoy intentando es erróneo o una alternativa funcional. Gracias por leer!

Xefiron
  • 437
  • 5
  • 16
  • Posible duplicado de [¿Cuál es la solución a todos los errores NullPointerException presentes, pasados y futuros?](https://es.stackoverflow.com/questions/42977/cu%c3%a1l-es-la-soluci%c3%b3n-a-todos-los-errores-nullpointerexception-presentes-pasados) – Sith Nazgûl Cat Dec 27 '18 at 22:10
  • Si bien es cierto, uno de los errores en mi código es un nullpointer, no es el foco de mi pregunta. Es más el tema de los arreglos, sobre como trabaja uno en dependencia del otro. El mensaje de error lo indiqué principalmente debido a las líneas que hacen referencia a NewClass. – Xefiron Dec 27 '18 at 22:32
  • He editado la pregunta para evitar la confusión anterior. Gracias por su tiempo. – Xefiron Dec 27 '18 at 22:42

2 Answers2

1

Por lo que se ve en tu codigo, te faltan agregar dos cosas: 1- Inicializar tu arreglo de string : por ejemplo String[] ciudades = new String[10]; 2- Al imprimir agregar una condicion para que no imprima los valores nulos:

if (mostrar != null)
            System.out.println(mostrar);

Te esta imprimiendo un nullpointer porque esta intentando acceder al vector con un indice inexistente. Cualquier consulta a las ordenes ! Saludos

  • Efectivamente la condición if solucionó el problema de imprimir nulos. Por otro lado, el objetivo de String[]ciudades es tomar el largo del int[]a, y escribirse como valor en si mismo el nombre de una ciudad presente en el switch en base al número que le envío int[]a. – Xefiron Dec 27 '18 at 22:29
  • La variable de []ciudades la deje en null por el tema de que estimé que si la dejaba en null usaría el largo del otro arreglo como referencia. Seguramente un fallo de mi parte. – Xefiron Dec 27 '18 at 22:48
1

para crear un Array con el mismo tamanio que otro se debe utilizar el length del array para obtener su tamanio, por ejemplo:

int valoresaBuscar[] = new int[10];
String ciudades[] = new String[valoresaBuscar.length];

Ademas, para realizar este metodo de busqueda de forma efficiente (desde una perspetiva de ciclos de CPU (big O notation) la mejor forma de implementar esto es mediante un Mapa(java.util.map o alguna de sus implementaciones) de valores en donde su peor rendimiento sera O(log n) (en el caso de HashMap)

en el siguiente ejemplo se crea el Mapa con los valores de las Ciudades a buscar se anaden al mapa con el uso del metodo HashMap.put(<valor de la llave>,<valor String>); y para extraer el valor string dado un Valor int(o Integer) se realiza mediante el uso de HashMap.get(<valor entero>) o getOrDefault(<valor entero>, <valor String en caso que no este en el mapa>)

import java.util.HashMap;
import java.util.concurrent.ThreadLocalRandom;

public class ValueToString {

    private static final HashMap<Integer, String> mapaDeValores = createmapping();

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        int randomarray[] = getRandomArray();
        String ciudades[] = lector(randomarray);
        //inprimir el array:
        for (String ciudad : ciudades) {
            System.out.println(ciudad);
        }

    }

    /**
     * crea un HashMap que contienen un Mapa de Valores enteros y nombres de ciudades de forma
     * que las busquedas de valores tomen en el peor de los casos O(log n)
     *
     * @return un Hashmap de Valores-String
     */
    private static HashMap<Integer, String> createmapping() {
        HashMap<Integer, String> mapping = new HashMap<>();
        mapping.put(1, "New York");
        mapping.put(2, "Tokio");
        mapping.put(3, "Moscú");
        return mapping;
    }

    private static int[] getRandomArray() {
        int valoresaBuscar[] = new int[10];
        for (int i = 0; i < valoresaBuscar.length; i++) {
            //un valor random entre 1(inclusive) y hasta 4 ("excluido") osea para fines practicos es un valor entre 1 y 3.   
            valoresaBuscar[i] = ThreadLocalRandom.current().nextInt(1,4);
        }
        return valoresaBuscar;
    }

    private static String[] lector(int[] input) {
        //cree un array de Strings del mismo tamanio que el Array input
        String ciudades[] = new String[input.length];
        for (int i = 0; i < input.length; i++) {
            //ciudades[i] = mapaDeValores.get(input[i]);
            //getOrDefault utilizamos getOrDefault para en el caso de que el Mapping no exista retorne el string "Ciudad no Existe" en lugar de "null"
            ciudades[i] = mapaDeValores.getOrDefault(input[i], "Ciudad no Existe");
        }
        return ciudades;
    }
}
Sith Nazgûl Cat
  • 717
  • 5
  • 11
  • Muchisimas gracias, este código cumplió con toda expectativa y más. Definitivamente lo que necesitaba. – Xefiron Dec 28 '18 at 13:23