Jump to content
Babixa

[Resolvido] Como eliminar um elemento de um array?

Recommended Posts

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 ;)

Edited by Rui Carlos
Formatação do código.

Share this post


Link to post
Share on other 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 ?

  • Vote 1

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

Share this post


Link to post
Share on other sites
Babixa

Sinceramente não.

Tive a pensar na tua resposta mas não faço ideia de como fazer :x

Mas obrigada pela dica.

Share this post


Link to post
Share on other 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 ?

Edited by HappyHippyHippo
  • Vote 1

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

Share this post


Link to post
Share on other sites
Babixa

Então, supostamente só posso copiar para o destino se no array origem ainda não tiver nenhum número igual, certo?

Share this post


Link to post
Share on other 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

  • Vote 1

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

Share this post


Link to post
Share on other 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++;
 }
}

  • Vote 1

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

Share this post


Link to post
Share on other sites
Babixa

Eish, obrigada *.*

Já percebi ;)

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

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

Share this post


Link to post
Share on other 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] + " ");
  }
 }
}
}

Edited by brunoais
geshi

Share this post


Link to post
Share on other 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] + " ");
   }   
 }
}

  • Vote 1

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

Share this post


Link to post
Share on other 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...

Share this post


Link to post
Share on other sites
Babixa

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

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

Edited by Babixa

Share this post


Link to post
Share on other 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

  • Vote 1

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

Share this post


Link to post
Share on other 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 ...

Share this post


Link to post
Share on other 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] + " ");
   }   
 }
}

Edited by HappyHippyHippo

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

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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)

Share this post


Link to post
Share on other 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

  • Vote 1

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.