Como comparar arrays no java

Java Programming Java 8Object Oriented Programming

Arrays can be compared using following ways in Java

  • Using Arrays.equals(array1, array2) methods − This method iterates over each value of an array and compare using equals method.

  • Using Arrays.deepEquals(array1, array2) methods − This method iterates over each value of an array and deep compare using any overridden equals method.

Using == on array will not give the desired result and it will compare them as objects. See the example below for each of the comparison way.

Example

 Live Demo

import java.util.Arrays; public class Tester{    public static void main(String[] args) {       int[] array1 = {1, 2, 3};       int[] array2 = {1, 2, 3};       System.out.println("Arrays: array1 = [1, 2, 3], array 2 = [1, 2, 3]");       //Scenario 1 : Comparing using ==       System.out.println("== results: " + (array1 == array2));       //Scenario 2 : Comparing using Arrays.equals()       System.out.println("Arrays.equals() results: " + Arrays.equals(array1,array2));       Object[] objArray1 = {array1};       Object[] objArray2 = {array2};       System.out.println("Arrays: objArray1 = {array1}, objArray1 = {array2}");       //Scenario 3 : Comparing using Arrays.equals()       System.out.println("Arrays.equals() results: " + Arrays.equals(objArray1,objArray2));       //Scenario 4 : Comparing using Arrays.deepEquals()       System.out.println("Arrays.deepEquals() results: " + Arrays.deepEquals(objArray1,objArray2));    } }

Output

Arrays: array1 = [1, 2, 3], array 2 = [1, 2, 3] == results: false Arrays.equals() results: true Arrays: objArray1 = {array1}, objArray1 = {array2} Arrays.equals() results: false Arrays.deepEquals() results: true

Como comparar arrays no java

Published on 30-Aug-2018 08:13:56

If you want to just compare 2 elements in the array, you don't need a function for that. You are passing in n, but you could just check that a[n] == b[n]. I'm assuming what you want is a function that compares the whole arrays.

Instead of returning true when the first elements are equal and trying to return false at the end, scan the entire array looking for elements that are NOT equal. As soon as you reach a pair that is NOT equal, you know the arrays are not equal and you can return false. If none of the elements are NOT equal, then the elements are all equal and you can return true.

public static boolean compArray (double[] a, double[] b) { for (int i = 0; i < a.length; i++) { if (a.length == b.length) { if (a[i] != b[i]) { return false; } } } return true; }

You may want to look into the difference between break and return.

Another thing you can do is move the length check outside the loop, like this:

public static boolean compArray (double[] a, double[] b) { // immediately exit if the lengths are not equal if (a.length != b.length) { return false; } // loop through and exit once an unequal pair is found for (int i = 0; i < a.length; i++) { if (a[i] != b[i]) { // returns from the whole function, not just the for loop return false; } } // if this code is reached, the lengths must have been equal and there were no pairs that didn't match, so the arrays must be completely equal return true; }

This makes the code more readable and makes it so the length condition doesn't need to be checked on every loop iteration -- just once at the beginning of the function.

Você pode utilizar algoritmos de ordenação e técnicas de interseção e União, siga estes passos em sua ordem:

  • Ordenar os Array
  • Verificar a Interseção dos Array
  • Unir a Interseção dos mesmos.

Da Ordenação:

Você pode utilizar um algoritmo existente denominado MergeSort, onde ele utiliza a estratégia "dividir-para-conquista" e a complexidade do mesmo no melhor e pior caso é O(n log n).

Exemplo animado do funcionamento do MergeSort:

Como comparar arrays no java

Algoritmo:

public class WikiMerge<T extends Comparable<T>>{ /** * Método que recebe um array de inteiros e dois inteiros referentes ao início e ao fim * da ordenação desse array, o que nos garante o poder de escolher uma faixa do array * para ser ordenado. * * @param array * @param indiceInicio * @param indiceFim */ public void ordena(T[] array, int indiceInicio, int indiceFim) { // Condicional que verifica a validade dos parâmetros passados. if (array != null && indiceInicio < indiceFim && indiceInicio >= 0 && indiceFim < array.length && array.length != 0) { int meio = ((indiceFim + indiceInicio) / 2); ordena(array, indiceInicio, meio); ordena(array, meio + 1, indiceFim); merge(array, indiceInicio, meio, indiceFim); } } /** * O merge consiste na junção de duas listas já ordenadas. * Usa um array auxiliar. * * @param array * @param indiceInicio * @param meio * @param indiceFim */ public void merge(T[] array, int indiceInicio, int meio, int indiceFim) { T[] auxiliar =(T[]) new Comparable[array.length]; //Copiando o trecho da lista que vai ser ordenada for (int i = indiceInicio; i <= indiceFim; i++) { auxiliar[i] = array[i]; } //Índices auxiliares int i = indiceInicio; int j = meio + 1; int k = indiceInicio; //Junção das listas ordenadas while (i <= meio && j <= indiceFim) { if (auxiliar[i].compareTo(auxiliar[j]) < 0) { array[k] = auxiliar[i]; i++; } else { array[k] = auxiliar[j]; j++; } k++; } //Append de itens que não foram usados na Junção while (i <= meio) { array[k] = auxiliar[i]; i++; k++; } //Append de itens que não foram usados na Junção while (j <= indiceFim) { array[k] = auxiliar[j]; j++; k++; } } }

Da Interseção

Você pode utilizar diversas técnicas (algoritmos) existente para fazer a interseção e união, onde a complexidade do mesmo é de O(n+m) que é igual a O(n).

Algoritmo de uma das Técnicas de Interseção e União:

// Um programa em Java para imprimir união e interseção /// de duas matrizes não classificadas import java.util.Arrays; class UnionAndIntersection { //Imprime a união de arr1 [0..m-1] e arr2 [0..n-1] void printUnion(int arr1[], int arr2[], int m, int n) { // Antes de encontrar a união, certifique-se de que arr1 [0..m-1] // é menor if (m > n) { int tempp[] = arr1; arr1 = arr2; arr2 = tempp; int temp = m; m = n; n = temp; } // Agora arr1 [] é menor // Ordenar o primeiro array e imprime seus elementos (esses dois // as etapas podem ser trocadas, pois a ordem na saída não é importante) Arrays.sort(arr1); for (int i = 0; i < m; i++) System.out.print(arr1[i] + " "); // Pesquisar todos os elementos da matriz maior em uma matriz menor // e imprime o elemento se não for encontrado for (int i = 0; i < n; i++) { if (binarySearch(arr1, 0, m - 1, arr2[i]) == -1) System.out.print(arr2[i] + " "); } } // Imprime intersecção de arr1 [0..m-1] e arr2 [0..n-1] void printIntersection(int arr1[], int arr2[], int m, int n) { // Antes de encontrar o cruzamento, certifique-se de que arr1 [0..m-1] // é menor if (m > n) { int tempp[] = arr1; arr1 = arr2; arr2 = tempp; int temp = m; m = n; n = temp; } // Agora arr1 [] é menor // Classificar array menor arr1 [0..m-1] Arrays.sort(arr1); // Pesquisar todos os elementos da matriz maior em uma matriz menor // e imprima o elemento se encontrado for (int i = 0; i < n; i++) { if (binarySearch(arr1, 0, m - 1, arr2[i]) != -1) System.out.print(arr2[i] + " "); } } // Uma função de pesquisa binária recursiva. Retorna a localização de x em // dado array arr [l..r] está presente, caso contrário -1 int binarySearch(int arr[], int l, int r, int x) { if (r >= l) { int mid = l + (r - l) / 2; // Se o elemento estiver presente no meio if (arr[mid] == x) return mid; // Se o elemento for menor que o meio, então ele só pode // estar presente no subarray esquerdo if (arr[mid] > x) return binarySearch(arr, l, mid - 1, x); // Else o elemento só pode estar presente no subarray direito return binarySearch(arr, mid + 1, r, x); } // Nós chegamos aqui quando o elemento não está presente no array return -1; } // Programa do driver para testar as funções acima public static void main(String[] args) { UnionAndIntersection u_i = new UnionAndIntersection(); int arr1[] = {7, 1, 5, 2, 3, 6}; int arr2[] = {3, 8, 6, 20, 7}; int m = arr1.length; int n = arr2.length; System.out.println("Union of two arrays is "); u_i.printUnion(arr1, arr2, m, n); System.out.println(""); System.out.println("Intersection of two arrays is "); u_i.printIntersection(arr1, arr2, m, n); } }

Note:

PS:

  • Existem diversos outros algoritmos para ordenar, então sugiro que acesse este link para saber mais sobre os mesmos.
  • Leia atentamente o link das técnicas de interseção e união, pois existem diversas técnicas para o qual tem sua utilidade.