Comparar Arraylists e retornar valores diferentes na saída

5 respostas Resolvido
stringjavaarraylist
L

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…

5 Respostas

S

Mas é pra comparar array ou ArrayList?

E

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

H
Solucao aceita

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).

L

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

L

// 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!!!

Criado 12 de março de 2022
Ultima resposta 15 de mar. de 2022
Respostas 5
Participantes 4