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

Babixa

[Resolvido] Como eliminar um elemento de um array?

Mensagens Recomendadas

Babixa

Boas pessoal .

Tenho um trabalho para uma cadeira da faculdade em que tenho de programar em java.

Tou com sérios problemas em resolvê-lo. Já pesquisei pesquisei pesquisei e sinceramente ainda não percebi como é que isto se faz.

O problema é:

Faça o programa P04ArrayCopyWithoutReps que declare um array de 20 inteiros, iniciados através do uso do gerador aleatório Random, com um valor compreendido entre 0 e 50, mostre o conteúdo do array numa linha, determine quantas repetições existem (se o array tiver: {2,4,5,2,4,3,2} nele existem três repetições), copie o seu conteúdo para um novo array mas de modo a eliminar as repetições, e mostre o conteúdo do novo array numa linha. Deverá manter o posicionamento relativo dos valores (o resultado do outro array seria: {2,4,5,3}), exceptuando claro as repetições e o novo array deve ter a dimensão estritamente necessária para conter os valores inicias sem as repetições.

O meu código é:

import java.util.Random;
public class P04ArrayCopyWithoutReps {

 static int comparar(int[] arr, int value){
   for(int i = 0; i < arr.length; i++){
     if(arr[i] == value)
       return i;
   }
   return -1;
 }

 public static void main(String[] args){

   Random rg = new Random();

   int um[] = new int[20];
   int dois[] = new int[20];

   System.out.println("O array gerado com os números entre 0 e 50 é: ");
   for (int i = 0; i < 20; i++){
     um[i] = rg.nextInt(51);
     System.out.print(um[i] + " ");
   }

   int index = 0;
   for(int i = 0; i < um.length; i++) {
     index = comparar(um, um[i]);
     if((index >= 0) && (index < i)){
       //aqui tenho de eliminar o valor repetido
     }else{
       dois[i] = um[i];
     }
   }

   System.out.println("");
   System.out.println("O array resultante é: ");

   for (int i = 0; i < dois.length; i++){
     System.out.print(dois[i] + " ");
   }
 }
}

A minha maior dúvida é como eliminar a posição do array.

Sugeriram-me que mudasse todas as posições do array para a esquerda, mas não sei como fazê-lo.

E acho que o array dois[] não deveria ter tamanho definido, mas não consigo fazê-lo de outra maneira.

Fico à espera que me possam ajudar ;)

Editado por Rui Carlos
Formatação do código.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

dica : não eliminas, simplesmente não copias.

o segredo está em saber se deves copiar ou não : não te vem à cabeça como o fazer ?

  • Voto 1

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

cria um código que copia um array para um segundo array, algo deste género:

int origem[1000];
int destino[1000];

int norigem = 0;
int ndestino = 0;

// preencher o array "origem"

for (int i = 0; i < norigem; i++)
{
 if (/*se devo copiar para o destino*/)
 {
   destino[ndestino] = origem[i];
   ndestino++;
 }
}

agora pensa, o que leva a que possa ou não copiar um número da origem para o destino ?

Editado por HappyHippyHippo
  • Voto 1

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

será quase isso

só deverás copiar se nunca tiveres tive copiado um número com o mesmo valor.

agora arranja uma solução para poder implementar essa regra

  • Voto 1

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

ok, ok ...

int origem[1000];
int destino[1000];
int hits[50];

int norigem = 0;
int ndestino = 0;

// preencher o array "origem"

for (int i = 0; i < 50; i++)
{
 hits[i] = 0;
}

for (int i = 0; i < norigem; i++)
{
 if (!hits[origem[i]])
 {
   hits[origem[i]] = 1;
   destino[ndestino] = origem[i];
   ndestino++;
 }
}

  • Voto 1

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Babixa

Eish, obrigada *.*

Já percebi ;)

Mas está a dar-me erro no ! ...

Diz que o operador é indefinido para o tipo inteiro ...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Babixa

Eu não consigo definir os arrays dessa maneira.

O meu código agora está assim:

import java.util.Random;
public class testar {

public static void main(String[] args){

 Random rg = new Random();

 int origem[] = new int[20];
 int destino[] = new int[20];
 int hits[] = new int[50];

 int nOrigem = 0;
 int nDestino = 0;

 System.out.println("O array gerado com os números entre 0 e 50 é: ");
 for (int i = 0; i < origem.length; i++){
  origem = rg.nextInt(51);
  System.out.print(origem + " ");
 }

 for (int i = 0; i < 50; i++)
 {
   hits = 0;
 }

 System.out.println(" ");
 System.out.println("O array resultante é: ");
 for (int i = 0; i < nOrigem; i++){
  if (hits[origem] == 0){
   hits[origem] = 1;
   destino[nDestino] = origem;
   nDestino++;
   System.out.print(destino[nDestino] + " ");
  }
 }
}
}

Editado por brunoais
geshi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

   destino[nDestino] = origem[i];                 // gravas o valor em nDestino
   nDestino++;                                    // incrementas o valor de nDestino
   System.out.print(destino[nDestino] + " ");     // que valor apresentas aqui ????

estás a começar a programar, deverias ignorar código que pode levar a erro.

separa sempre o código funcional do código de apresentação, dessa forma não terias esse erro ....

import java.util.Random;
import java.util.Arrays;

public class testar {
 public static void main(String[] args){
   Random rg = new Random();

   int origem[] = new int[20];
   int destino[] = new int[20];
   int hits[] = new int[50];

   int nOrigem = 0;
   int nDestino = 0;

   System.out.println("O array gerado com os números entre 0 e 50 é: ");
   for (int i = 0; i < origem.length; i++) {
     origem[i] = rg.nextInt(51);
   }

   // separação de código !!! apresentação do array
   for (int i = 0; i < origem.length; i++) {
     System.out.print(origem[i] + " ");
   }

   // só para aprenderes coisas novas
   Arrays.fill(hits, 0);

   for (int i = 0; i < nOrigem; i++){
     if (hits[origem[i]] == 0) {
       hits[origem[i]] = 1;
       destino[nDestino] = origem[i];
       nDestino++;
     }
   }

   // separação de código !!! apresentação do array
   System.out.println(" ");
   System.out.println("O array resultante é: ");
   for (int i = 0; i < nDestino; i++){
     System.out.print(destino[i] + " ");
   }   
 }
}

  • Voto 1

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Babixa

Sim, ainda estou muito no principio, mas estás a dar-me uma grande ajuda ;)

Já agora, se:

int nOrigem = 0;
int nDestino = 0;

quando se entra nos for's o i não é menor do que o nOrigem e do que o nDestino...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Babixa

E não é necessário incrementar nOrigem++; ??

Caso contrário o nOrigem não muda de valor...

Editado por Babixa

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

E não é necessário incrementar nOrigem++; ??

Caso contrário o nOrigem não muda de valor...

sim, é

fiz copy paste do teu código e nem olhei para isso

  • Voto 1

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Babixa

Bem, eu incrementei o nOrigem++; no for para criar o array destino.

Agora, o que ele está a fazer é, assim que ver o primeiro valor repetido já não copia mais valores nenhuns ...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Bem, eu incrementei o nOrigem++; no for para criar o array destino.

   // criação da lista de números !!!
   System.out.println("O array gerado com os números entre 0 e 50 é: ");
   for (int i = 0; i < origem.length; i++) {
     origem[i] = rg.nextInt(51);

     nOrigem++; // <------ aqui

   }

-----------------------------

melhor ainda é descartar essa variável:

import java.util.Random;
import java.util.Arrays;

public class testar {
 public static void main(String[] args){
   Random rg = new Random();

   int origem[] = new int[20];
   int destino[] = new int[20];
   int hits[] = new int[50];

   int nDestino = 0;

   System.out.println("O array gerado com os números entre 0 e 50 é: ");
   for (int i = 0; i < origem.length; i++) {
     origem[i] = rg.nextInt(51);
   }

   // separação de código !!! apresentação do array
   for (int i = 0; i < origem.length; i++) {
     System.out.print(origem[i] + " ");
   }

   // só para aprenderes coisas novas
   Arrays.fill(hits, 0);

   for (int i = 0; i < origem.length; i++){
     if (hits[origem[i]] == 0) {
       hits[origem[i]] = 1;
       destino[nDestino] = origem[i];
       nDestino++;
     }
   }

   // separação de código !!! apresentação do array
   System.out.println(" ");
   System.out.println("O array resultante é: ");
   for (int i = 0; i < nDestino; i++){
     System.out.print(destino[i] + " ");
   }   
 }
}

Editado por HappyHippyHippo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Fitorinaudo

Yo. Desculpem lá, mas pa qqeq serve o vector hits[]? E Arrays.fill(hits, 0);´ ? Qeq isto faz tambem? É um metodo da biblioteca do java certo?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Yo.

Yo ...

pa qqeq serve o vector hits[]?

serve para guardar os números já inseridos no array final

E Arrays.fill(hits, 0);´ ?

serve para atribuir o valor do segundo argumento a todos os elementos do array


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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
LuisMendes330

O array hits servirá para colocar os valores gerados a 1 caso estes sejam 0 penso eu...

Este programa tá a dar um erro, não consigo perceber muito bem como solucionar...

run:

O array gerado com os números entre 0 e 50 é:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 50

18 20 21 44 9 40 47 44 25 46 15 13 50 19 21 43 46 19 22 16 at retirarepetidos.Retirarepetidos.main(Retirarepetidos.java:40)

Java Result: 1

BUILD SUCCESSFUL (total time: 0 seconds)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Este programa tá a dar um erro, não consigo perceber muito bem como solucionar...

se dá erro é porque não é o apresentado por mim

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