cómo se podría ir sobre la comprobación de un duplicado de las columnas y filas y devolver true o false dependiendo de si hay duplicados. Por ejemplo

1 2 3

3 1 2

2 3 1

Devolverá true porque no duplicados, pero..

1 2 2

3 2 3

2 1 1

devolverá false porque no es un duplicado en la columna 2 {2, 2, 1}.

Cómo se podría ir sobre la comprobación de si hay duplicados en las filas y, a continuación, comprobar si hay duplicados en las columnas?

Hasta ahora sólo tengo las siguientes:

public static boolean hasDuplicates(int [][] inArray)
{
   for (int row = 0; row < inArray.length; row++)
   {
      int rowCheck = inArray[row][inArray.length];
      for (int col = 0; col < inArray[row].length; col++)
      {

      }
   }
   return false;
}

Así que tengo que tomar en una matriz y comprobar si existen duplicados entre las columnas o filas. Alguna sugerencia? Gracias!

NOTA: Esto no se puede hacer con fuera de los métodos

  • ¿cómo se 3-2-3 no un «duplicado» en el primer ejemplo? Es un poco confuso lo que estás preguntando.
  • mis disculpas! La tercera fila debe ser 2-3-1, editado!
  • Usted puede encontrar su respuesta en este (exactamente el mismo) pregunta: stackoverflow.com/questions/6122315/…
InformationsquelleAutor user3335070 | 2014-02-20

4 Comentarios

  1. 1

    Ir a través de cada valor en la fila. Para cada valor, comprobar y ver si alguno de los valores después de que valor son las mismas. Si el valor es el mismo, devolver verdadero (has encontrado un duplicado). Si ninguno de los valores son los mismos, el incremento de su índice y hacer lo mismo para la siguiente fila. Cada fila tendrá en la mayoría de las n(n+1)/2 comparisions que no es maravilloso. Así que, si n es el número de columnas y m el número de filas, esto va a ejecutar, en el peor caso m(n(n+1)/2) veces.

    Aquí es un ejemplo de cómo funcionaría para las filas:

    /**
     * Return flag indicating if there are duplicates in the rows of the 2D array
     * 
     * @return true if a row has duplicates, else false
     */
    public boolean hasDuplicatesInRows(int[][] inArray)
    {
        for (int row = 0; row < inArray.length; row++)
        {
            for (int col = 0; col < inArray[row].length; col++)
            {
                int num = inArray[row][col];
                for (int otherCol = col + 1; otherCol < inArray.length; otherCol++)
                {
                    if (num == inArray[row][otherCol])
                    {
                        return true;
                    }
                }
            }
        }
    
        return false;
    }

    Que sería bastante fácil de extender a hacer columnas así. Voy a dejar que puedes hacer aunque.

    Si usted utiliza un eficiente método para ordenar y ordena todas las filas, sólo podía ir hacia abajo de la línea y ver si algún valor es igual al valor después de ella. Si es así, devolver true, de lo contrario devuelve false. Esto sería más eficiente si usted tenía un gran conjunto de datos.

    • Lo siento, debería haber mencionado que no puedo usar ninguna fuera de los métodos. Gracias por tu ayuda aunque, ojalá pudiera ir a esta ruta
    • Usted debe editar tu pregunta y añadir que en
    • hecho. Tienes alguna sugerencia para hacerlo sin. Entiendo el concepto pero no sé cómo conseguirlo
    • Yo fijo mi respuesta a la no utilización de las Colecciones. Es casi el mismo, como antes, sino que se hace un chequeo para cada valor de la fila en contra de los otros valores. No estoy convencido de que este es el más eficiente, pero funciona y es sencillo.
    • Muchas gracias, no puedo expresar lo agradecido que estoy.. he estado trabajando en esto desde las 11 y he estado en este bloque. Gracias. Para obtener las columnas sería yo, a continuación, el interruptor de ellos alrededor de así que el primer bucle for sería for (int col = 0; col < inArray[0].length; col++) la fila en el interior? A continuación, sustituir la fila para el otherCol?
    • Me alegra poder ayudar! Y sí, que cómo iba a cambiar
    • Aweomse, muchas gracias. Definitivamente, usted me salvó de tracción de una toda la noche!

  2. 1

    Digamos que crear un método que opera en una sola matriz unidimensional. Romper el problema en la extracción de tiras de números a partir de su matriz 2d en una 1d array. Es la firma que podría parecer boolean containsDupes(int[] strip) { ... }.

    Hay un par de métodos en que el método que sería más fácil de resolver. Uno sería para ordenar la matriz de modo que los incautos están uno al lado del otro. Otro sería para llenar un HashSet con cada valor y comparar el tamaño del Conjunto con la longitud de la matriz.

  3. 1

    Una forma más compacta de la consecución de esta tarea es añadir todos los valores a un Conjunto y, a continuación, comparar el número de elementos únicos en el Conjunto de la original de tamaño de fila de uso de la guayaba.

    public static boolean hasDuplicates(int [][] inArray) {
        for (int row = 0; row < inArray.length; row++) {
            int curRow = inArray[row];
            Set set = Sets.newHashSet(Arrays.asList(curRow));
            if (set.size() < curRow.length) {
                return true;
            }
        }
        return false;
    }
    • este es un programa donde no estoy permitido el uso de conjuntos o listas. Lo siento, debería haber mencionado que el anterior.
  4. 1

    para las filas, trate de seguir este tipo de procedimiento:

    boolean dup = false;
    for (int k = 0; k < inArray[0].length){ //loop through columns
      for (i = 0; i < inArray.length-1; i++) {
        for (int j = i; j < inArray.length; j++){
          if (inArray[k][i] == inArray[k][j]){
            dup = true;
            break;
          }
        }
      }
    }

    así, estás comenzando por el primer elemento, luego de escaneo de un elemento a 2 a n (es decir, número de columnas). Si se encuentra una coincidencia, entonces usted está estableciendo el booleano true. Si no coinciden, entonces yo se incrementa, y el bucle for interno es el análisis de elemento 3 a n.

    Seguir un procedimiento similar para las columnas, y listo!

    • así que sería for (i = 0; i < n-1; i++) ser for (i = 0; i < inArray.length-1; i++) y, a continuación, el siguiente ser for(int j = i; j < inArray[i].length; j++)? Gracias por tu ayuda @h_k
    • Sí. Yo tenía «n» allí originalmente, porque yo empecé a hacer mi respuesta más generalizada. Voy a tirar que en mi respuesta.

Dejar respuesta

Please enter your comment!
Please enter your name here