Comparar Arraylists e retornar valores diferentes na saída

Olá, tenho um método abaixo que funciona bem.
Mas preciso fazer com que ele me retorne quais valores não encontrou na comparação de arrays.
Por exemplo, abaixo o “PALIO” e “CELTA” não existem no array word, então no retorno, caso o array seja diferente, preciso que me retorne algo do tipo: System.out.println("Carros" + "carros diferentes" + "são diferentes!");

String[] chave = {"GOL", "CORSA", "PALIO", "CELTA"};
String[] word = {"GOL", "CORSA"}; 

if(chave[0].equals(word[0]))
{
        System.out.println("Carros iguais!");
    }else{
        System.out.println("Carros Diferentes!");
}

Alguém pode me ajudar? Não sei como fazer isso…

Mas é pra comparar array ou ArrayList?

Olá, eu faria assim:

package main;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;

public class Main {

	public static void main(String[] args) {
		String[] chave = { "GOL", "CORSA", "PALIO", "CELTA" };
		String[] word  = { "GOL", "CORSA" };

		List<String> listChave  = Arrays.asList(chave);
		List<String> listWord   = Arrays.asList(word);
		List<String> diferentes = new ArrayList<String>();
		List<String> iguais     = new ArrayList<String>();

		listChave.forEach(chav -> {
			Optional<String> filtro = listWord.stream().filter(ff -> ff.equals(chav)).findAny();
			if (!filtro.isPresent()) {
				diferentes.add(chav);
			} else {
				iguais.add(chav);
			}
		});

		// imprime diferenças
		System.out.println("Diferentes:");
		diferentes.forEach(System.out::println);

		System.out.println("-----------");
		// imprime iguais
		System.out.println("Iguais:");
		iguais.forEach(System.out::println);

	}

}

Saida do console:

Diferentes:
PALIO
CELTA

Iguais:
GOL
CORSA

1 curtida

Para obter os elementos de chave que não estão em word, você pode converter os arrays para java.util.Set, que possui operações que facilitam a tarefa:

String[] chave = {"GOL", "CORSA", "PALIO", "CELTA"};
String[] word = {"GOL", "CORSA"};

// transforma os arrays em Set
Set<String> chaves = new HashSet<>(Arrays.asList(chave));
Set<String> words = new HashSet<>(Arrays.asList(word));

// remove os elementos que estão em "words" (no caso, GOL e CORSA)
chaves.removeAll(words);

// o que sobrar são os elementos de "chaves" que não estão em "words"
System.out.println("Carros: " + String.join(", ", chaves) + " são diferentes");

Claro que você poderia fazer vários loops para verificar se cada elemento de chave está em word, mas Set's são mais eficientes para este tipo de busca. Claro que tem o custo inicial de criar o Set, mas se for para manipular muitos arrays com vários elementos, pode compensar bastante.

Lembrando que HashSet não garante que a ordem dos elementos é preservada. Se a ordem é importante, basta trocar para LinkedHashSet:

Set<String> chaves = new LinkedHashSet<>(Arrays.asList(chave));
Set<String> words = new LinkedHashSet<>(Arrays.asList(word));

Obs: a partir do Java 9 você pode usar Set.of:

Set<String> chaves = Set.of(chave);
Set<String> words = Set.of(word);

Mas assim como HashSet, ele não garante a ordem dos elementos (se for para garantir a ordem, teria que usar LinkedHashSet mesmo).

1 curtida

Obrigado!!! Utilizei o método do Hugo e funcionou perfeitamente também.

// remove os elementos que estão em “words” (no caso, GOL e CORSA)
chaves.removeAll(words);

// o que sobrar são os elementos de “chaves” que não estão em “words”
System.out.println(“Carros: " + String.join(”, “, chaves) + " são diferentes”);

Isso funcionou pra mim, Hugo! Obrigado!!!