Recebendo uma lista

Preciso de uma ajuda nesse código, o resultado da variável opcao1 não esta executando dentro do while, só a variável opcao2 que esta sendo executada pelo while, podem me ajudar?

            Scanner sc = new Scanner(System.in);
	List <String> list= new ArrayList<>();

	System.out.print("Jogador 1 - Digite o seu nome: ");
	String primeiro_nome = sc.nextLine();
	System.out.print("Jogador 2 - Digite o seu nome: ");
	String segundo_nome = sc.nextLine();
	Jogadores jogadores = new Jogadores(primeiro_nome, segundo_nome);
	
	System.out.print(primeiro_nome + ", você escolhe 'pedra', 'papel' ou 'tesoura'? ");
	String opcao1 = sc.nextLine();
	list.add(opcao1);
	System.out.print(segundo_nome + ", você escolhe 'pedra', 'papel' ou 'tesoura'? ");
	String opcao2 = sc.nextLine();
	list.add(opcao2);
	
	for(String obj : list) {

	String opcao_antigo = "";
	while (!obj.equalsIgnoreCase("pedra") & !obj.equalsIgnoreCase("papel")
			& !obj.equalsIgnoreCase("tesoura")) {
		System.out.println("Favor escrever 'pedra', 'papel' ou 'tesoura'!");
		obj = sc.nextLine();

	}
	while (obj.equalsIgnoreCase(opcao_antigo)) {
		System.out.println("O Jogador 1 ja escolheu " + obj.toUpperCase() + ". 
           Escolha outra opção!");
		obj = sc.nextLine();

		while (!obj.equalsIgnoreCase("pedra") & !obj.equalsIgnoreCase("papel")
				& !obj.equalsIgnoreCase("tesoura")) {
			System.out.println("Favor escrever 'pedra', 'papel' ou 'tesoura'!");
			obj = sc.nextLine();

		}
	}
	opcao_antigo = obj;
	}
for(String obj : list) {
  String opcao_antigo = "";

Inicialize a variavel opcao_antigo antes do for. Assim:

String opcao_antigo = ""
for(String obj : list) {

Uma sugestão eu vi que você tá validando a entrada do usuário!

while (!obj.equalsIgnoreCase("pedra") & !obj.equalsIgnoreCase("papel")
			& !obj.equalsIgnoreCase("tesoura")) {
		System.out.println("Favor escrever 'pedra', 'papel' ou 'tesoura'!");
		obj = sc.nextLine();

	}

Então seria mais interessante se você fizesse isso no momento em que o usuário digita pela primeira vez o valor!
Que sabe você não cria uma função para isso!

1 curtida

@Jelson1 eu ja fiz uma função e não deu certo, cheguei a fazer tb duas funções separadas, uma para cada parâmetro recebido e mesmo assim ele não esta executando a opção 1 q é o primeiro jogador, só executa a opção 2…aonde esta o erro?

1 curtida

A função que eu falei era apenas uma sugestão! Que pode ficar para depois. Mas você fez isso que falei?

Isso em relação ao código original que você postou acima!

@Jelson1 sim coloquei antes do for, mesmo assim não deu certo…

@Albertassi88 posta o código aqui! Para ver se a gente resolve!

@Jelson1

                  public static void main(String[] args) {

	      Scanner sc = new Scanner(System.in);
		List <String> list= new ArrayList<>();

		System.out.print("Jogador 1 - Digite o seu nome: ");
		String primeiro_nome = sc.nextLine();
		System.out.print("Jogador 2 - Digite o seu nome: ");
		String segundo_nome = sc.nextLine();
		Jogadores jogadores = new Jogadores(primeiro_nome, segundo_nome);
		
		System.out.print(primeiro_nome + ", você escolhe 'pedra', 'papel' ou 'tesoura'? ");
		String opcao1 = sc.nextLine();
		list.add(opcao1);
		System.out.print(segundo_nome + ", você escolhe 'pedra', 'papel' ou 'tesoura'? ");
		String opcao2 = sc.nextLine();
		list.add(opcao2);
		

		String opcao_antigo = "";
		for(String obj : list) {

		while (!obj.equalsIgnoreCase("pedra") & !obj.equalsIgnoreCase("papel")
				& !obj.equalsIgnoreCase("tesoura")) {
			System.out.println("Favor escrever 'pedra', 'papel' ou 'tesoura'!");
			obj = sc.nextLine();

		}
		while (obj.equalsIgnoreCase(opcao_antigo)) {
			System.out.println("O Jogador 1 ja escolheu " + obj.toUpperCase() + ".Escolha outra opção!");
			obj = sc.nextLine();

			while (!obj.equalsIgnoreCase("pedra") & !obj.equalsIgnoreCase("papel")
					& !obj.equalsIgnoreCase("tesoura")) {
				System.out.println("Favor escrever 'pedra', 'papel' ou 'tesoura'!");
				obj = sc.nextLine();

			}
		}
		opcao_antigo = obj;
		}

OPA! Pode explicar o que ele deveria fazer? E o que tá acontecendo? Por que eu olhando seu código aqui, não percebo nada de errado! Um exemplo do que é para acontecer!

@Jelson1 nessa parte abaixo a opcao1 e opcao2 recebe as palavras digitadas pedra ou papel ou tesoura

            System.out.print(primeiro_nome + ", você escolhe 'pedra', 'papel' ou 'tesoura'? ");
	String opcao1 = sc.nextLine();
	list.add(opcao1);
	System.out.print(segundo_nome + ", você escolhe 'pedra', 'papel' ou 'tesoura'? ");
	String opcao2 = sc.nextLine();

Nessa outra parte abaixo: o while recebe a palavra digitada da opcao1 e a palavra da opcao2 e ele verifica se escrevi corretamente a palavra ‘pedra ou papel ou tesoura’, se por exemplo eu escrever outra palavra tipo mouse. ele tem que entrar do while que aparece a mensagem: (“Favor escrever ‘pedra’, ‘papel’ ou ‘tesoura’!”);…quando eu rodo o programa a palavra da opcao1 não faz essa checagem se escrevi a palavra corretamente, só na palavra digitada da opcao2 que ele verifica essa condição e aparece a mensagem (“Favor escrever ‘pedra’, ‘papel’ ou ‘tesoura’!”) , deu pra entender?

            String opcao_antigo = "";
	for(String obj : list) {

	while (!obj.equalsIgnoreCase("pedra") & !obj.equalsIgnoreCase("papel")
			& !obj.equalsIgnoreCase("tesoura")) {
		System.out.println("Favor escrever 'pedra', 'papel' ou 'tesoura'!");
		obj = sc.nextLine();

	}
	while (obj.equalsIgnoreCase(opcao_antigo)) {
		System.out.println("O Jogador 1 ja escolheu " + obj.toUpperCase() + ".Escolha outra opção!");
		obj = sc.nextLine();

		while (!obj.equalsIgnoreCase("pedra") & !obj.equalsIgnoreCase("papel")
				& !obj.equalsIgnoreCase("tesoura")) {
			System.out.println("Favor escrever 'pedra', 'papel' ou 'tesoura'!");
			obj = sc.nextLine();

		}
	}
	opcao_antigo = obj;
	}

@Albertassi88 acho que entendi! Que dizer que quando você coloca algo diferente de pedra, papel e tesoura o programa não faz a verificão?
exemplo se você colocar pão e papel o programa aceita?

@Jelson1 sim se colocar pão e papel ele aceita, pois a opcao 1 não esta sendo verificada, mais se eu colocar exemplo pão e pneu, o pneu vai ser verificado e vai pedir para eu digitar a palavra correta…

Oi desculpe a demora eu tô pelo celular! Testei seu código com um compilador online. Ocorreu tudo certo!

Obs eu adicionei um System.out.println(obj) para saber qual é a opção que está sendo verificada!

Quando a entrada é casa e pedra:
O valor digitado está depois do ?.

Quando a entrada é pedra e casa:

Quando é pedra e papel:

Codigo:

Scanner sc = new Scanner(System.in);
	List <String> list= new ArrayList<>();

	String primeiro_nome = "joao";
	String segundo_nome = "Matheus";
	
	System.out.print(primeiro_nome + ", você escolhe 'pedra', 'papel' ou 'tesoura'? ");
	String opcao1 = sc.nextLine();
	list.add(opcao1);
	System.out.print(segundo_nome + ", você escolhe 'pedra', 'papel' ou 'tesoura'? ");
	String opcao2 = sc.nextLine();
	list.add(opcao2);
	
    String opcao_antigo = ""; 
	for(String obj : list) {
         System.out.println("Opção: "+obj+"\n"); //só para mostrar qual é a palavra que está sendo processada!

	while (!obj.equalsIgnoreCase("pedra") & !obj.equalsIgnoreCase("papel")
			& !obj.equalsIgnoreCase("tesoura")) {
		System.out.println("Favor escrever 'pedra', 'papel' ou 'tesoura'!");
		obj = sc.nextLine();

	}
	while (obj.equalsIgnoreCase(opcao_antigo)) {
		System.out.println("O Jogador 1 ja escolheu " + obj.toUpperCase() + ". 
           Escolha outra opção!");
		obj = sc.nextLine();

		while (!obj.equalsIgnoreCase("pedra") & !obj.equalsIgnoreCase("papel")
				& !obj.equalsIgnoreCase("tesoura")) {
			System.out.println("Favor escrever 'pedra', 'papel' ou 'tesoura'!");
			obj = sc.nextLine();

		}
	}
	opcao_antigo = obj;
}

Uma coisa é que as opções estão sendo modificadas. Então você tem que atualizar na lista (caso você utilize novamente essa lista). Alterando o for, fique atento aos comentários:

String opcao_antigo = "";
for(int i = 0; i<list.size();i++) {
     System.out.println("Opção: "+list.get(i)+"\n"); //só para mostrar qual é a palavra que está sendo processada!

    String obj = list.get(i); //aqui Eu pego o valor da opção;
	
	while (!obj.equalsIgnoreCase("pedra") & !obj.equalsIgnoreCase("papel")
			& !obj.equalsIgnoreCase("tesoura")) {
		System.out.println("Favor escrever 'pedra', 'papel' ou 'tesoura'!");
		obj = sc.nextLine();

	}
	while (obj.equalsIgnoreCase(opcao_antigo)) {
		System.out.println("O Jogador 1 ja escolheu " + obj.toUpperCase() + ". 
           Escolha outra opção!");
		obj = sc.nextLine();

		while (!obj.equalsIgnoreCase("pedra") & !obj.equalsIgnoreCase("papel")
				& !obj.equalsIgnoreCase("tesoura")) {
			System.out.println("Favor escrever 'pedra', 'papel' ou 'tesoura'!");
			obj = sc.nextLine();

		}
	}
    list.set(i,obj);  //aqui Eu atualizo o valor na lista!
	opcao_antigo = obj;
}

@Jelson1 pra mim esta dando erro , ele não esta aceitando o list[i]

@Albertassi88 olha de novo eu editei o post! Tava confundido as coisas! Como tá trabalhando com lista o correto era list.get(i). Olha de novo o codigo que postei e vê se dá certo!

@Jelson1 entendi, funciona sim obrigado, mais eu queria mesmo fazer sem usar o get e set, eu cheguei a fazer dois métodos, um para cada opção recebida e sinceramente não deu para entender o pq a primeira opção esta sendo modificada pois os métodos q tinha feito eram individuais para cada opção recebida…eu queria entender o pq não deu certo dessa forma…

Não sei se eu entendi e também não sei como você fez, mas pegando o exemplo do código que você tinha postato:

for(String obj : list) {

		while (!obj.equalsIgnoreCase("pedra") & !obj.equalsIgnoreCase("papel")
				& !obj.equalsIgnoreCase("tesoura")) {
			System.out.println("Favor escrever 'pedra', 'papel' ou 'tesoura'!");
			obj = sc.nextLine();

		}
        [...]

Você tinha criado um tipo especial de for: for(String obj: list)

  1. Que criar a variavel obj e atribuí um elemento da lista em cada interação do laço até pecorrer todos.
  2. Depois vem o primeiro while que, se a entrada do usuário for inválida ele obriga digitar novamente e atribuí o valor digitado a variavel obj, o mesmo ocorrer com o segundo while

Então é na etapa 2 que ocorre o perigo! Como eu falei, ele atribui a nova entrada a variave obj, ou seja a sua lista permanece intacta, sem ser alterada!
Então depois que esse for os valores da lista continua a mesma coisa! Por isso o uso do for padrão:
for(int i = 0; i < list.size(); i++) e do método get é set.
Por que dessa forma eu consigo atualizar os valores da lista e não só da variável obj.

Existem várias formas de percorrer uma lista é tudo isso depende da situação.
Exemplo: numa situação que eu quero apenas mostrar os valores na tela, é mais fácil eu fazer isso:

for(String s: minhaLista){
      System.out.println(s);
}

Do que:

for(int i = 0; i<minha lista.size(); i++){
      s = minhaLista.get(i);
     System.out.println(s);
}

Mas quando eu quero alterar um valor da lista o segundo exemplo acaba se tornando mais prático! Então tudo isso depende da sua situação, e também do seu gosto, qual método você prefere!

Não sei se eu respondi a sua pergunta! Kkkkk
Mas seu problema foi resolvido?

Existe algum motivo?

@Jelson1 sobre a sua pergunta, é coisa minha mesmo, o get eu não ligo em usar mais a questão de alterar valores usando o set não gosto muito, só em algumas situações mesmo…mais é coisa minha rsrs…mais olha esse exemplo abaixo:

Eu estou com dois métodos para cada opção recebido e mesmo assim o primeiro valor esta sendo alterado, nesse exemplo não estou conseguindo entender o motivo, pois cada método esta recebendo e retornando o seu valor…

package Brin;

import java.util.Scanner;

public class Pedr {

public static void main(String[] args) {
	Scanner sc = new Scanner(System.in);
	System.out.println("J 1: ");
	String op1 = sc.nextLine();
	System.out.println("J 2: ");
	String op2 = sc.nextLine();
	
	Reg reg = new Reg();
	reg.Regggg(op1);
	reg.Regggg2(op2);

package Brin;

import java.util.Scanner;
public class Reg {
Scanner sc = new Scanner(System.in);
public String Regggg(String op1) {

	while ((!op1.equalsIgnoreCase("ped")) & (!op1.equalsIgnoreCase("tes"))
			& (!op1.equalsIgnoreCase("pap"))) {
		System.out.println("Dig corr po");
		op1 = sc.nextLine();
	}
	return op1;
}
public String Regggg2(String op2) {

	while ((!op2.equalsIgnoreCase("ped")) & (!op2.equalsIgnoreCase("tes"))
			& (!op2.equalsIgnoreCase("pap"))) {
		System.out.println("Dig corr po");
		op2 = sc.nextLine();
	}
	return op2;
}

}

@Albertassi88, Olha tem duas coisa que você tem que ter em mente:

  1. Você criou duas funções que faz a mesma coisa, sendo que uma das finalidades das funções é reutilizar o código!
  2. As suas funções estão retornado uma String, mas você não está armazenando elas em lugar nenhum.

Uma alternativa é criar uma função na mesma classe, cuja a única finalidade é pegar a entrada do usuário e validar ao mesmo tempo!

public class Pedr {

   public static void main(String[] args) {

       //Quando eu for pegar as opções eu uso a função!
         // passando o Scanner criado (sc) como parâmetros.
	   Scanner sc = new Scanner(System.in);
	   System.out.println("J 1: ");
   	   String op1 = pegarEntrada(sc); // pega o valor e armazena em op1;
	   System.out.println("J 2: ");
	   String op2 = pegarEntrada(sc); //pega a nova entrada e armazena em op2

       System.out.println("Opçao 1: "+op1);
       System.out.println("Opçao 2: "+op2); 
   }

   //Essa é a função para pegar a entrada e validar
   public static String pegarEntrada(Scanner sc){
        String  op = "";
        do{
            op = sc.nextLine();
        }while ( !op.equalsIgnoreCase("ped") & !op.equalsIgnoreCase("tes") & (!op.equalsIgnoreCase("pap"));
    
        return op;
   }
   // nesse caso eu usei o (do while) no lugar de while
}