Jump to content

[Resolvido] Como eliminar um elemento de um array?


Recommended Posts

Posted

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 😉

Posted (edited)

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
Posted

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
Posted (edited)

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
Posted
   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
Posted

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

Posted

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

Posted (edited)

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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • 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.