Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

TGmarks

procurar em array

Mensagens Recomendadas

TGmarks

Caros amigos, estou a tentar fazer um programa que pede ao utilizador para introduzir palavras para um array, depois fazer o mesmo para um segundo array, e no final terá que procurar a penúltima palavra que foi inserida no segundo array e, caso esta exista no primeiro removê-la.

aqui está o código que eu fiz até agora:

import java.util.*;
/**
* Escreva um programa que leia uma série de palavras terminada por “fim” para um array.
Posteriormente, o programa deverá ler mais uma série de palavras terminada por “ok”. O
programa deverá verificar se a palavra inserida imediatamente antes da palavra “ok” existe
no array e se existir deverá removê-la.
*
* @author Tiago
*/
public class fimEok {
   public static void main (String args[]) {
    String[] palavras, palavras2;
    palavras = new String[1000];
    palavras2 = new String[1000];
    System.out.println("Insira uma série de palavras, para terminar inserir fim");
    for (int i = 0; i < 1000; i++){
	    Scanner input = new Scanner (System.in);
	    palavras[i] = input.next();
	    if (palavras[i].equals("fim")){
		    System.out.println("Insira outra série de palavras, para terminar inserir ok");
		    for (int x = 0; x < 1000; x++){
			    palavras2[x] = input.next();
			    if (palavras[x].equals("ok")){ //pára de ler array
				    //código para procurar palavra anterior a "ok" e eliminá-la no 1º array
				    System.out.println(palavras[i]); //imprimir o array sem a palavra removida
			    }

		    }
	    }
    }



   }

}

As minhas dúvidas são:

1º como é que eu vou buscar o penultimo valor? pode-se usar por ex. palavras-1 ??

2º como faço uma procura no array?

3º como se apaga uma entrada no array?

Desde já agradeço qualquer ajuda.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

antes de pensar nesses casos, deverias estruturar melhor a a tua aplicação, teres ciclo dentro de ciclo (quase) nunca é uma boa solução ... e já agora olha bem o número de ciclos que estás a executar


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Jabba

Deixa-me sugerir que alteres os teus ciclos for por ciclos while. Com esses ciclos vais pedir ao utilizador 1000*1000 palavras e não é isso o pretendido, penso. Com um while podes meter uma segunda condição de paragem, muito mais eficiente neste caso porque evitas os ciclos encadeados.

Quanto as dúvidas:

1º palavras[palavras.length-2];

2º visto que o array não está organizado, terás de o percorrer até encontrares a palavra;

3º num array é díficil... talvez colocar esse elemento a null.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

1º palavras[palavras.length-2];

nop.

se escreveu a palavra fim/ok antes de char a 1000 palavras então a penúltima palavra não é dada pela essa instrução.

é necessário guardar o número de palavras guardadas

3º num array é díficil... talvez colocar esse elemento a null.

colocar a null não +e solução pois irá ficar com um "buraco" no array

é necessário "mover" as palavras para o seu novo local ou ter um terceiro array somente com as palavras aceites


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
TGmarks

Viva! Ainda não consegui concluir este programa, pois queria implementar um ciclo while no meu programa, mas não sei como o fazer até porque nunca implementei nenhum.

Será que alguém me pode ajudar como é que eu faria para implementar um ciclo while neste caso?

Obg

... a minha ideia seria qualquer coisa como while (palavras.!equals("fim") .... mas o ciclo while não funciona assim pois não?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

o problema não na estrutura do ciclo while, mas na instrução que tens de condição do ciclo:

while ((palavras[i].!equals("fim"))
//                  |
//          este operador está mal
//           é erro de sintaxe
{
}

para resolver o teu problema com um ciclo while, deverias ter em conta que a palavra fim não faz parte do conjunto de palavras.

deverás ler a palavra para um local, confirmar que é válida e se sim, guardar no array correspondente


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Jabba

Um ciclo while é simples de se entender: enquanto algo (variável booleana) não ocorrer, o seu corpo repetir-se-á.

Portanto, o que eu faria era definir uma variável booleana e uma variável de progresso. Iniciar o ciclo, com essa condição E com a condição do i (variável de progresso) ser menor que o tamanho do vector. Se encontrar a palavra fim, a variável booleana toma outro valor (de modo a não reentrar no ciclo). Caso contrário, coloca a palavra no vector e, muito importante, no fim do ciclo incrementar o valor de i.

Só tens de ter atenção se o número de palavras inseridas não vai exceder as 1000 :cheesygrin:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
TGmarks

Fiz o seguinte código:

public class fimEok {
   public static void main (String args[]) {
   boolean fim;
   boolean ok;
   int i = 0;
   int x = 0;
   Scanner input = new Scanner (System.in);
   String[] palavras = new String[1000];
   String[] palavras2 = new String[1000];
   System.out.println("Introduza uma série de palavras. Para terminar introduza 'fim'");
   while (fim=false || i < 1000){
	   palavras[i] = input.next();
	   if (palavras[i].equals("fim")){
		   fim = true;
	   }
	   i++;
   }
   System.out.println("Introduza outra série de palavras. Para terminar introduza 'ok'");
   while (ok=false || x < 1000){
	   palavras2[x] = input.next();
	   if (palavras2[x].equals("ok")){
		   ok = true;
	   }
	   x++;

   }

   }

mas ao introduzir a palavra fim continua sempre a aceitar valores ...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
rezanov

comparação ==

atribuição =

2º dentro do while tens duas condições, ora a albebra de boole para o OR diz que verdade OU falso = verdade e falso OU verdade = verdade.

Editado por rezanov

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Jabba

Exacto, deves inicializar o valor das variáveis a false. Depois no while tens de ter atenção porque ao fazeres = estas a atribuir um valor a essa variável e não a comparar. E tal como tinha dito, a condição do while não é uma condição de paragem, é uma condição de avanço. Ou seja, se o que meteres na condição se verificar então entra no ciclo. Daí o operador a ser usado ser o &&.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
TGmarks

Boas, acho que estou no bom caminho para dar este programa por concluído: tenho um ciclo for para correr o primeiro array e comparar a palavra que coloquei antes da instrução "ok", agora para eliminar a palavra repetida, a solução passa por copiar todo o array excepto a palavra repetida para um novo array. Sei que tenho de usar o método arraycopy, mas não sei como este funciona, muito menos como não passar a palavra pretendida

mais uma vez tenho que agradecer a V/ ajuda

public class fimEok {
   public static void main (String args[]) {
      boolean fim = false;
      boolean ok = false;
      int i = 0;
      int x = 0;
      Scanner input = new Scanner (System.in);
      String[] palavras = new String[1000];
      String[] palavras2 = new String[1000];
      System.out.println("Introduza uma série de palavras. Para terminar introduza 'fim'");
      while (fim == false && i < 1000){
          palavras[i] = input.next();
          if (palavras[i].equals("fim")){
              fim = true;
          }
          i++;
      }
      System.out.println("Introduza outra série de palavras. Para terminar introduza 'ok'");
      while (ok == false && x < 1000){
          palavras2[x] = input.next();
          if (palavras2[x].equals("ok")){
              ok = true;
          }
          x++;

      }
      for (i = 0; i < palavras.length; i++){
          if (palavras2[x-2].equals(palavras[i])){
              System.arraycopy(x, x, input, x, x); //e agora????????
          }
      }


   }
}

Editado por TGmarks

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Jabba

Aqui tens como usar o método ArrayCopy: http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/System.html#arraycopy(java.lang.Object, int, java.lang.Object, int, int).

Rapidamente, System.arraycopy(arrayFrom, indiceNoArrayFrom, ArrayTo, indiceNoArrayTo, numElementosCopiados). Em que arrayFrom é o array inicial, indiceNoArrayFrom é a posição a partir do qual queres copiar, ArrayTo é o array para onde queres copiar, indiceNoArrayTo a posição a partir da qual vais começar a escrever, e numElementosCopiados é o número de elementos que vão ser copiados.

Dentro do if, para encontrares a palavra anterior a palavra "ok" no array deveria ser palavras2[palavras2.length-2].

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
TGmarks

Obrigado, já percebi como se faz a cópia, mas existe a possibilidade de não copiar uma das posições? Porque é para isso que eu iria utilizar outro array...

Dentro do if se utilizar palavras2[palavras2.length-2] não irá buscar sempre o valor da posição 998?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Jabba

Sim, tens razão desculpa.

Podes tentar isto:

int[] newArray = new int[i]; //e i porque incrementas sempre o i, mesmo depois de ter chegado o fim
System.arraycopy(palavras1, 0, newArray, 0, posDaPalavra );
System.arraycopy(original, posDaPalavra+1, newArray, posDaPalavra, i - posDaPalavra);
return n;

Editado por Jabba

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

olhando para o enunciado :

O programa deverá verificar se a palavra inserida imediatamente antes da palavra “ok” existe no array e se existir deverá removê-la

- é só a palavra antes do "ok" ?

- de que array é para remover ?


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

código para remover todas as palavras do segundo array do primeiro array

import java.util.*;

/**
* Escreva um programa que leia uma série de palavras terminada por “fim” para
* um array. Posteriormente, o programa deverá ler mais uma série de palavras
* terminada por “ok”. O programa deverá verificar se a palavra inserida
* imediatamente antes da palavra “ok” existe no array e se existir deverá
* removê-la.
*/
public class WordSearch
{
protected static final int ARRAY_SIZE = 1000;
protected static final String FIRST_LIMIT = "fim";
protected static final String SECOND_LIMIT = "ok";

public static void main(String args[])
{
	Scanner sc = new Scanner(System.in);
	String word = "";

	System.out.println("Insira os elementos da primeira lista ('fim' para terminar) : ");
	String first[] = new String[ARRAY_SIZE];
	int first_size = 0;
	while (first_size != ARRAY_SIZE && !word.equals(FIRST_LIMIT))
	{
		word = sc.next();
		if (!word.equals(FIRST_LIMIT))
		{
			first[first_size] = word;
			first_size++;
		}
	}
	first = Arrays.copyOf(first, first_size);

	System.out.println("Insira os elementos da segunda lista ('ok' para terminar) : ");
	String second[] = new String[ARRAY_SIZE];
	int second_size = 0;
	while (second_size != ARRAY_SIZE && !word.equals(SECOND_LIMIT))
	{
		word = sc.next();
		if (!word.equals(SECOND_LIMIT))
		{
			second[second_size] = word;
			second_size++;
		}
	}
	second = Arrays.copyOf(second, second_size);

	Arrays.sort(second, new Comparator()
	{
		public int compare(Object s1, Object s2)
		{
			return ((String) s1).compareTo((String) s2);
		}
	});

	/* SOLUÇÃO SEM ARRAYCOPY */
	String result[] = new String[first.length];
	int result_size = 0;
	for (int i = 0; i < first.length; i++)
	{
		if (Arrays.binarySearch(second, first[i]) < 0)
		{
			result[result_size] = first[i];
			result_size++;
		}
	}
	result = Arrays.copyOf(result, result_size);

	System.out.println("Elementos não eliminados (SEM ARRAY COPY): ");
	for (int i = 0; i < result.length; i++)
	{
		System.out.print(result[i] + " ");
	}
	System.out.println("");

	/* SOLUÇÃO COM ARRAYCOPY */
	for (int i = 0; i < first.length; i++)
	{
		if (Arrays.binarySearch(second, first[i]) >= 0)
		{
			if (i < first.length - 2)
			{
				System.arraycopy(first, i + 1, first, i, first.length - i - 2);
			}
			first = Arrays.copyOf(first, first.length - 2);
		}
	}

	System.out.println("Elementos não eliminados (SEM ARRAY COPY): ");
	for (int i = 0; i < first.length; i++)
	{
		System.out.print(first[i] + " ");
	}
	System.out.println("");
}
}


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
LuisMendes330

HappyHippyHippo na parte com arraycopy não ta a funcionar bem.

Já agora se puderes podias explicar porque tornas a classe public?porque não private?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

HappyHippyHippo na parte com arraycopy não ta a funcionar bem.

corrigido:

import java.util.*;

/**
* Escreva um programa que leia uma série de palavras terminada por “fim” para
* um array. Posteriormente, o programa deverá ler mais uma série de palavras
* terminada por “ok”. O programa deverá verificar se a palavra inserida
* imediatamente antes da palavra “ok” existe no array e se existir deverá
* removê-la.
*/
public class WordSearch
{
   protected static final int ARRAY_SIZE = 1000;
   protected static final String FIRST_LIMIT = "fim";
   protected static final String SECOND_LIMIT = "ok";

   public static void show(String list[])
   {
       for (int i = 0; i < list.length; i++)
       {
           System.out.print(list[i] + " ");
       }
       System.out.println("");
   }

   public static void main(String args[])
   {
       Scanner sc = new Scanner(System.in);
       String word = "";

       System.out.println("Insira os elementos da primeira lista ('fim' para terminar) : ");
       String first[] = new String[ARRAY_SIZE];
       int first_size = 0;
       while (first_size != ARRAY_SIZE && !word.equals(FIRST_LIMIT))
       {
           word = sc.next();
           if (!word.equals(FIRST_LIMIT))
           {
               first[first_size] = word;
               first_size++;
           }
       }
       first = Arrays.copyOf(first, first_size);

       System.out.println("Insira os elementos da segunda lista ('ok' para terminar) : ");
       String second[] = new String[ARRAY_SIZE];
       int second_size = 0;
       while (second_size != ARRAY_SIZE && !word.equals(SECOND_LIMIT))
       {
           word = sc.next();
           if (!word.equals(SECOND_LIMIT))
           {
               second[second_size] = word;
               second_size++;
           }
       }
       second = Arrays.copyOf(second, second_size);

       Arrays.sort(second, new Comparator()
       {
           public int compare(Object s1, Object s2)
           {
               return ((String) s1).compareTo((String) s2);
           }
       });

       /* SOLUÇÃO SEM ARRAYCOPY */
       String result[] = new String[first.length];
       int result_size = 0;
       for (int i = 0; i < first.length; i++)
       {
           if (Arrays.binarySearch(second, first[i]) < 0)
           {
               result[result_size] = first[i];
               result_size++;
           }
       }
       result = Arrays.copyOf(result, result_size);

       System.out.println("Elementos não eliminados (SEM ARRAY COPY): ");
       show(result);

       /* SOLUÇÃO COM ARRAYCOPY */
       for (int i = 0; i < first.length; i++)
       {
           if (Arrays.binarySearch(second, first[i]) >= 0)
           {
               if (i < first.length - 1)
               {
                   System.arraycopy(first, i + 1, first, i, first.length - i - 1);
               }
               first = Arrays.copyOf(first, first.length - 1);

               i--;
           }
       }

       System.out.println("Elementos não eliminados (COM ARRAY COPY): ");
       show(first);
   }
}

Já agora se puderes podias explicar porque tornas a classe public?porque não private?

porque não ?


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
LuisMendes330

porque não ?

Ok dá um erro...

Mas se puser sem o public o código é compilado na mesma.O que faz o public?

Se tiveres tempo mete nesse código comentários a descrever os métodos(construtor, selector, modicador...), classes, variáveis etc.

Obrigado

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Se tiveres tempo mete nesse código comentários a descrever os métodos(construtor, selector, modicador...), classes, variáveis etc.

nop

lê o código e aprende, se não fizeste o código, ao menos tenta perceber !!!


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
LuisMendes330

Eu já percebi o que o código faz. Eu não percebo é as razões de se usar (e quando usar) os public, private, procteted,..

Por exemplo quando declaraste a variável ARRAY_SIZE , colocaste protected static final. Isto significa que tu já não podes alterar mais o valor desta variável certo? Ou seja não poderias construir um método modificador para arraysize ...?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

public : acessivel a todos os elementos da aplicação

protected : acessível somente à classe e suas derivadas

private : acessível somente à classe que declara

sim, ARRAY_SIZE é a maneira de declarar valores constantes em Java.

Editado por HappyHippyHippo
  • Voto 1

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.