Buscando en matriz multidimensional -- java campo con array campo con search camp codereview Relacionados El problema

Searching in Multidimensional Array


2
vote

problema

Español

Me preguntaba acerca de la matriz incorporada en los métodos en Java 8. Como no hay un método específico que no sea Arrays.binarySearch . Así que para la matriz multidimensional escribí el siguiente método.

  CsvConversionResult0  

Comprobando

  CsvConversionResult1  

Salida

  CsvConversionResult2  

Me gustaría una revisión de la eficiencia y la calidad del código general. También cualquier mejoras que pueda hacer para mejorarlo.

Original en ingles

I was wondering about the Array built in methods in java 8. As there is no specific method other than Arrays.binarySearch. So for multidimensional array I wrote following method.

public int[] search(Integer[][] mat,int key)     {         int r=0,c=0;         for(Integer[] a:mat)         {             if(Arrays.asList(a).contains(key)){                 c = Arrays.asList(a).indexOf(key);                 break;             }             else r++;         }         return new int[]{r+1,c+1};     } 

checking

 Integer[][] mat = {{1,2,3,99},{4,5,6,57},{7,8,9,89},{10,11,12,13}}; int [] rc = new int[2];  rc = search(mat, 8);  System.out.println(Arrays.toString(rc));  rc = search(mat, 9);  System.out.println(Arrays.toString(rc));  rc = search(mat,10);  System.out.println(Arrays.toString(rc));  rc = search(mat, 1);  System.out.println(Arrays.toString(rc));     

output

[3, 2] [3, 3] [4, 1] [1, 1] 

I would like a review of efficiency and general code quality. Also any improvements I can do to make it better.

        
       
       

Lista de respuestas

3
 
vote
vote
La mejor respuesta
 

Algunas cosas por mencionar:

Como se ha mencionado, está utilizando una indexación basada en 1 en lugar de una indexación basada en 0. 0-basado es mucho más intuitivo, ya que la mayoría de las implementaciones, de indexación en la mayoría de los lenguajes de programación, use la indexación basada en 0.

Está utilizando el Arrays.asList dos veces para cada iteración del bucle. Esto aumenta la ineficiencia.

Llamar indexOf dentro del bucle está creando básicamente otro bucle y no gana nada, el bucle no le daría.

Creo que el nombre de su método podría ser mejor. search Indica todo lo que desea es el valor. Sin embargo, estás devolviendo los índices. Por lo tanto, indexesOf podría ser más apropiado, y más en el ajuste con métodos similares en otras colecciones.

Su método es codificado para int . Esto no es muy extensible. Una versión genérica probablemente sería más apropiado.

Usted está devolviendo un int[] . Esto realmente no le dice a nadie lo que se supone que esto representa. Sugeriría una clase ( 99887776655544337 ) para que los índices le permitirían representarlos con un nombre que inmediatamente permitirá que el usuario sepa lo que representa.

No ha hecho ninguna provisión para manejar las búsquedas fallidas.

Me parece que la matriz 2D es básicamente una matriz. Por lo tanto, sugeriría etiquetar los índices como tales (fila, columna).

El Indexes Clase se vería así:

  public class Indexes {     int row = 0;     int col = 0;      public Indexes(int row, int col) {         this.row = row;         this.col = col;     }      public Indexes() {     }      public int getRow() {         return row;     }      public void setRow(int row) {         this.row = row;     }      public int getCol() {         return col;     }      public void setCol(int col) {         this.col = col;     }     @Override     public String toString(){         return String.format("[%d, %d]",row,col);     } }   

Una versión generificada con los puntos que mencioné podría verse algo así:

  indexOf0  

Editar código alternativo basado en los comentarios de OP

  indexOf1  
 

A few things to mention:

As has been mentioned, you're using 1-based indexing instead of 0-based indexing. 0-based is much more intuitive, since most implementations, of indexing in most programming languages, use 0-based indexing.

You're using the Arrays.asList twice for each iteration of the loop. This increases the inefficiency.

Calling indexOf inside the loop is basically creating another loop and doesn't gain anything a for loop wouldn't give you.

I think the name of your method could be better. search indicates all you want is the value. However you're returning the indexes. Therefore indexesOf might be more appropriate, and more in fitting with similar methods in other collections.

Your method is hard coded for int. This isn't very extensible. A generic version would probably be more fitting.

You're returning an int[]. This doesn't really tell anyone what this is supposed to represent. I would suggest a class(Indexes) to hold the indexes would allow you to represent them with a name that will immediately let the user know what it represents.

You haven't made any provision to handle failed searches.

It looks to me that the 2D array is basically a matrix. Therefore I would suggest labeling the indexes as such(row,column).

The Indexes class would look like this:

public class Indexes {     int row = 0;     int col = 0;      public Indexes(int row, int col) {         this.row = row;         this.col = col;     }      public Indexes() {     }      public int getRow() {         return row;     }      public void setRow(int row) {         this.row = row;     }      public int getCol() {         return col;     }      public void setCol(int col) {         this.col = col;     }     @Override     public String toString(){         return String.format("[%d, %d]",row,col);     } } 

A generified version with the points I mentioned could look something like this:

public static<T> Indexes indexesOf(T[][] arr, T value){     for(int row = 0; row < arr.length; ++row){         for(int col = 0; col < arr[row].length; ++col){             if(arr[row][col].equals(value)){                 return new Indexes(row,col);             }         }     }     return new Indexes(-1,-1); } 

EDIT Alternative code based on OP's comments

static final int DEFAULT_RETURN_VALUE = -1; public static<T> Indexes indexesOf(T[][] arr, T value){     for(int row = 0; row < arr.length; ++row){             int col = indexOf(arr[row],value);             if(col > DEFAULT_RETURN_VALUE){                 return new Indexes(row,col);             }     }     return new Indexes(DEFAULT_RETURN_VALUE,DEFAULT_RETURN_VALUE); } public static<T> int indexOf(T[] arr, T value){     for(int i = 0; i < arr.length; ++i){         if(arr[i].equals(value)){             return i;         }     }     return DEFAULT_RETURN_VALUE; } 
 
 
         
         

Relacionados problema

3  Nede.js JSON Búsqueda y actualización  ( Node js json searching updating ) 
Estoy trabajando en un controlador de encendido / apagado basado en la web para múltiples interruptores. Estoy buscando una buena manera de administrar el est...

1  Buscando y reemplazando el texto  ( Searching and replacing text ) 
Modificador de listas de reproducción simple Este programa es un programa de búsqueda y reemplazo para archivos basados ​​en texto. El objetivo principal ...

5  Búsqueda binaria eficiente  ( Efficient binary search ) 
Mi implementación: 157 Implementación normal: 158 La diferencia de ser mi implementación hace una conjetura en el índice del valor en función de l...

4  Búsqueda a través de una lista de contactos para los criterios dados  ( Searching through a contact list for given criteria ) 
He estado mirando a este código por un tiempo ahora y estoy pensando que hay una manera de optimizarlo (a saber, el if - 9988777665544337 Declaración con ...

31  Un algoritmo de búsqueda  ( A search algorithm ) 
NodeData8 almacena toda la información del nodo que necesita el AStar algoritmo. Esta información incluye el valor de _cache0 , _cache1 y 998877665...

3  Encuentra una cadena en una matriz  ( Find a string in an array ) 
Este programa se utiliza para obtener nombres y números de N Person, imprima los números de una persona. Por favor, ayúdame a mejorar este código. Pregunta ...

4  HackerRank Grid Search Challenge  ( Hackerrank grid search challenge ) 
He escrito una respuesta para la búsqueda de la cuadrícula desafío en Hackerrank . Por favor, hágamelo saber de cualquier mejora que se pueda hacer en mi im...

14  ¿Encontrar la subtupla en una colección más grande?  ( Finding subtuple in larger collection ) 
Tengo una matriz plana de & lt; 1000 artículos y necesito encontrar los índices de una tupla / matriz más pequeña dentro de la matriz. La tupla para encontrar...

2  Pequeño marco de búsqueda de ruta genérica en Java  ( Small generic path search framework in java ) 
Tengo esta pequeña biblioteca de búsqueda de ruta genérica. No es perfecto en absoluto, así que necesito algunos comentarios para tener la oportunidad de mejo...

3  Búsqueda a través de archivos .xml para texto que existe en cualquier lugar del archivo  ( Search through xml files for text that exists anywhere in the file ) 
Tengo alrededor de 1000 archivos .xml en diferentes directorios bajo una carpeta raíz. Mi directorio raíz contiene la estructura de abajo: RootDir1720a...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos