Escreva um programa Java que receba palavras digitadas pelo usuário através do teclado, armazenando apenas as palavras diferentes em uma coleção, até o usuário digitar a palavra fim

Escreva um programa Java que receba palavras digitadas pelo usuário através do teclado, armazenando apenas as palavras diferentes em uma coleção, até o usuário digitar a palavra fim. Em seguida, pela segunda vez, solicite novamente ao usuário para digitar várias palavras até digitar a palavra fim, e após isso, informe quais são as palavras que foram digitadas na segunda vez que encontram-se armazenadas na coleção.

Exemplo:

Digite palavras ou fim para encerrar:

Porta
Notebook
Cama
Lápis
Mesa
fim

Novamente digite palavras ou fim para encerrar:

Porta - Localizado
Borracha - Não localizado
Mar - Não Localizado
Mesa - Localizado

fim

  1. O que você tentou fazer?
  2. Tem algum código?

é um trabalho de faculdade, postei aqui pq não to sabendo fazer de jeito nenhum, tem a ver com Java Collections

Leitura recomendada:

As outras questão que você abriu foram fechadas e essa vai ficar como aberta para solução do seu problema, por favor não abra diversas perguntas para a mesma duvida.

Anexados: @moderadores

package com.gmail.roloje777.userinput;

import java.io.;
import java.util.
;

/*

  • @author Joao Rolo
  • Escreva um programa Java que receba palavras digitadas pelo usuário através do teclado,
  • armazenando apenas as palavras diferentes em uma coleção, até o usuário digitar a palavra fim.
  • Em seguida, pela segunda vez, solicite novamente ao usuário para digitar várias palavras até
  • digitar a palavra fim, e após isso, informe quais são as palavras que foram digitadas na segunda
  • vez que encontram-se armazenadas na coleção.

ao olhar para as duas coisas acima vêm à mente

  1. como vou obter a entrada do Usuário

  2. Como obter palavras da lista de palavras

  3. Como sempre, há mais que uma maneira de resolver um problema
    O Java recomenda a utilização da consola java.io.para obter a entrada do utilizador
    Outra maneira poderia ser usar a classe Scanner ou passando o System.in para
    um leitor de InputStream que está embrulhado num leitor de buffer
    Eu faço uso de duas dessas classes, o Console e leitor buffer para mostrar como
    Eu aplicava-os.

  • note to make use of the Console, I start the compile progras a
    java java com.email.roloje777.userinput.Aplicação, dado que o Eclpse não carrega a consola
    else just change userInput1( set1); to userInput2 (set1);
  1. Mais uma vez, há muitas maneiras de fazer isso, mas a classe set Collection vem à mente aqui
    Pode-se fazer operações como união e intersecção em “sets”
    set1.addAll (set2) é uma união de dois “sets”
    set1.retainAll (set2) é uma intersecção dos dois conjuntos.

abaixo do Código

cumprimentos

*/

public class App {

private static void userInput1(Set<String> set) {
	Console console= System.console(); // Factory method, creates an instance of java.io.Console
	if(console != null) {			
		String word = null;
		System.out.println("Enter the word [end to exit]");
		while(!(word = console.readLine()).equalsIgnoreCase("end")) {
			
			if(word == null || word.length() == 0) {
				System.out.println("Its not a valid word, try again");
			}
			set.add(word);
			
		}
		
		
	}else {
		throw new RuntimeException("Error on obtaining the console");
	}
	
}

private static void userInput2(Set<String> set) {
	
	try (BufferedReader in = new BufferedReader(new InputStreamReader(System.in))){
		String word = null;
		System.out.println("Enter the word [end to exit]");
		while(!(word = in.readLine()).equalsIgnoreCase("end")) {
				if(word == null || word.length() == 0) {
				System.out.println("Its not a valid word, try again");
			}
			set.add(word);
			
		}
		
		
	}catch(IOException e){
		throw new RuntimeException("Error on obtaining the keyboard");
		
	}

}


public static void main(String[] args) {
	Set<String> set1 = new HashSet<>();
	Set<String> set2 = new HashSet<>();
	
	
	
	System.out.println("Entering first list of words");
	userInput1(set1);
	System.out.println("Entering second list of words");
	userInput2(set2);
	
	
	System.out.println("set1 = " + set1);
	System.out.println("set2 = "+ set2);
	set1.retainAll(set2);//// creates an intersection of the set1 with set2
	System.out.println("set1 union set2 = " +set1);

}

}

1 curtida

A solução que o @Joao_Emanuel_Monica apresentou dá pra ficar ainda mais compacta usando Streams:

import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Main {
  private static Set<String> run(final Scanner scan, final String message) {
    System.out.println(message); // @formatter:off
    return Stream.generate(scan::nextLine)
        .takeWhile(str -> !str.equalsIgnoreCase("fim"))
        .collect(Collectors.toUnmodifiableSet()); // @formatter:on
  }

  public static void main(String[] args) {
    try (final var scan = new Scanner(System.in)) {
      final var a = run(scan, "Entre com o primeiro conjunto de números");
      final var b = run(scan, "Entre com o segundo conjunto de números");
      final var c = new HashSet<String>(a);

      c.retainAll(b);

      System.out.printf("1º conjunto: %s\n", a);
      System.out.printf("2º conjunto: %s\n", b);
      System.out.printf("Intersecção: %s\n", c);
    }
  }
}

Mas se vc não puder usar o Set e tiver que se virar com ArrayList, daria pra fazer assim:

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class App {
  public static void main(String... args) {
    final List<String> a = new ArrayList<>();
    final List<String> b = new ArrayList<>();
    final List<String> c = new ArrayList<>();

    try (final Scanner scan = new Scanner(System.in)) {
      System.out.println("Primeiro");
      while (true) {
        final String str = scan.nextLine();

        if (str.equalsIgnoreCase("fim"))
          break;
        else if (!a.contains(str))
          a.add(str);
      }

      System.out.println("Segundo");
      while (true) {
        final String str = scan.nextLine();

        if (str.equalsIgnoreCase("fim"))
          break;
        else if (!b.contains(str))
          b.add(str);
      }
    }

    for (final String str : a)
      if (b.contains(str))
        c.add(str);

    System.out.printf("1º conjunto: %s\n", a);
    System.out.printf("2º conjunto: %s\n", b);
    System.out.printf("Intersecção: %s\n", c);
  }
}
1 curtida