Comparando ArrayList

Galera estou fazendo um jogo de truco para faculdade, e estou com a seguinte questão:

Tenho 4 listas com 3 cartas cada e preciso que essas cartas não saiam iguais, ate agr consegui fazer nao sair cartas iguais nas listas separadas

Nesse trecho é onde eu sorteio a carta:

package truco;
import java.util.*;

public class Cartas {
	
	private String sorteiaNum(){
		
		List<String> lista = new ArrayList<String>();
		
		lista.add("2");
		lista.add("3");
		lista.add("4");
		lista.add("5");
		lista.add("6");
		lista.add("7");
		lista.add("A");
		lista.add("K");
		lista.add("J");
		lista.add("Q");
		Collections.shuffle(lista); //Embaralha a lista.
		return lista.get(1);//retorna a primeira posicao da lista, porem embaralhada.
	}
	
	private String sorteiaNaip(){
		List<String> lista2 =  new ArrayList<String>();
		
		lista2.add("Copas");
		lista2.add("Espada");
		lista2.add("Paus");
		lista2.add("Ouro");
		Collections.shuffle(lista2);
		return lista2.get(1);
	}
	
	public String cartaFinal(){
		return sorteiaNum()+sorteiaNaip();
	}.

e aqui é onde eu faço a distribuição de carta

public class Jogador extends Cartas {
	
	public void distribuirCartas(){	
		
		//Set<String> cartasJogador = new LinkedHashSet<>();
		//Set cartasJogador = new HashSet();
		List<String> cartasJogador = new ArrayList<String>();
		
		for(int i=0; i<3; i++){
			boolean novo=false;
			while (!novo){
				String aux = cartaFinal();
				if(!verificaCarta(aux)){
					novo = true;
					cartasJogador.add(aux);
					cartasSorteadas(aux);
				}
			}
		}
		System.out.println(cartasJogador);
	}
}

e esses são os metodos:

Set<String> cartSort = new LinkedHashSet<String>();
	//List<String> cartSort = new ArrayList<String>();
	
	public void cartasSorteadas(String s){
		
		cartSort.add(s);
	}
	
	public boolean verificaCarta(String v){
		
		if(cartSort.contains(v)){
			return true;
		}else return false;	
	}
}

Recomendo que vc comece pelo domínio da sua aplicação, exemplo:

Baralho {
  Cartas[4*10]
}
Carta {
  num;
  naipe;
}
Jogador {
  Cartas[3];
}
Mesa {
  Baralho;
  Rodada[2 ou 3];
  Pontuação[2];
  Jogadores[2 ou 4]; // depende de quantos jogadores participam
  Vira;
}
Rodada {
  (Jogador/Carta)[2 ou 4] // carta que o jogador jogou na rodada;
  Ganhador; // quem ganhou, se empatou será null (exemplo)
}

Para a classe Baralho, vc poderia simplificar assim:

class Baralho {
  List<Carta> cartasDentro;
  List<Carta> cartasFora;

  Baralho() {
    for (String naipe: naipeList) {
      for (String num: numList) {
        cartasDentro.add(new Carta(num, naipe));
      }
    }
    embaralhar();
  }

  Carta obterCarta() {
    Carta c = cartasDentro.remove(0);
    cartasFora.add(c);
    return c;
  }

  void embaralhar() {
    cartasDentro.addAll(cartasFora);
    cartasFora.clear();
    Collections.shuffle(cartasDentro); 
  }
}

em seguida implemente funções mais fáceis, ou aquel que vc tem interesse.

To esboçando ainda o codigo já ate dei uma melhorada nele. Alguns pontos ja estão definidos o jogo é sempre de quatro jogadores.

public class Cartas {

private String sorteiaNum(){
	
	List<String> lista = new ArrayList<String>();
	
	lista.add("2");
	lista.add("3");
	lista.add("4");
	lista.add("5");
	lista.add("6");
	lista.add("7");
	lista.add("A");
	lista.add("K");
	lista.add("J");
	lista.add("Q");
	Collections.shuffle(lista); //Embaralha a lista.
	return lista.get(1);//retorna a primeira posicao da lista, porem embaralhada.
}

private String sorteiaNaip(){
	List<String> lista2 =  new ArrayList<String>();
	
	lista2.add("Copas");
	lista2.add("Espada");
	lista2.add("Paus");
	lista2.add("Ouro");
	Collections.shuffle(lista2);
	return lista2.get(1);
}

public String cartaFinal(){
	return sorteiaNum()+sorteiaNaip();
}

//Set<String> cartSort = new LinkedHashSet<String>();
//List<String> cartSort = new ArrayList<String>();

public boolean cartasSorteadas(String s){
	
	Set<String> cartSort = new HashSet<String>();
	return cartSort.add(s);
}

}

public class Jogador extends Cartas {

public void distribuirCartas(){	
	
	List<String> cartasJogador = new ArrayList<String>();
	
	for(int i=0; i<3; i++){
		boolean novo=false;
		while (!novo){
			String aux = cartaFinal();
			if(cartasSorteadas(aux)){
				novo = true;
				cartasJogador.add(aux);
			}
		}
	}
	System.out.println(cartasJogador);
}

}

A ideia é a seguinte eu sorteio um naip e depois um id (2,3…AKQJ), junto os dois, logo em seguida as cartas que vao sendo distribuidas eu testo em um metodo do tipo boolean com uma lista set no return ele add um indice porem se ja conter na lista ele nao add e retorna false. Isso nao deixa sair carta repetida para um jogador, mas repete para jogadores diferentes, agr to precisando de uma ideia para compara listas diferentes.

Então coloque uma list ou set como static ou singleton:

//Set<String> cartSort = new LinkedHashSet<String>();
static List<String> cartSort = new ArrayList<String>();

public static boolean cartasSorteadas(String s){

	// Set<String> cartSort = new HashSet<String>();
	return cartSort.add(s);
}

Rapaz tu é o cara, deu certo!!!

Tipo static faz o metodo ser da classe e nao referente ao objeto, então com isso eu consigo criar uma “lista temporaria” adicionando todas as cartas sorteadas, e que não “reseta” quando outro objeto faz uso do metodo. Com isso eu consigo fazer não sair cartas repetidas para um mesmo jogador e para jogadores diferentes. A unica coisa ai é que LIST nao funciona só o SET, pois o list deixa adicionar mesmo ja contendo. No fim das contas ficou assim:

static Set< String> cartSort = new HashSet< String>();

public static boolean ListTemp(String s){
	
	return cartSort.add(s);
}