Comparar arrays

4 respostas
S

Boas ppl,
Estou a tentar fazer este exercício que encontrei na net...
Utilizando a classe Scanner faça um programa que solicite a entrada de 10 números inteiros, logo após solicite a entrada de mais 5 números inteiros, compare os números obtidos e verifique se o segundo vetor está contido dentro do primeiro.

Já fiz a maior parte do código..

int i=1;
    int [] num = new int[11];
    int [] numdois = new int[10];
    Scanner teclado = new Scanner (System.in);
    
    do{ //Utilizo dois tipos de laços apenas para 'ser diferente' kkk
      System.out.println("Indique o "+i+"º nº para X: ");
      num[i] = teclado.nextInt();
      i++;
    }while(i<=10);
    
    
    for (int j=1;j<=5;j++){
      System.out.println("Indique o "+j+"º nº para Y: ");
      numdois[j] = teclado.nextInt();}
    
    for(int y=1;y<=num.length;y++){ //percorre o primeiro array
      for(int x=1;x<=numdois.length;x++){ //percorre o segundo array
        if (num[y] == numdois[x]){ //compara as posições de um array c/ o outro
          System.out.println("\nOs nºs "+num[y]+" e "+numdois[x]+" estão em ambos arrays"); //se as posições forem iguais
        }else{
          System.out.println("\nNão há iguais");} //se forem diferentes
      }
    }

Agora falta perceber o que estou a fazer mal porque o output não é o que pretendo... alguma sugestão?

4 Respostas

ErickRAR

Você está começando a preencher os valores a partir da segunda posição, 1. Vetores são base 0, começam a ser preenchidos na posição 0.

int [] num = new int[10]; //vetor com 10 posicoes
x[0]; //primeira posicao
x[1]; //segunda posição
x[2]; //Terceira posição
...
x[9]; //ultima posição

Outro problema é que você não está preenchendo o vetor todo, então ele preenche as outras posições automaticamente com 0 (valor default do int). Assim, como tem zeros em ambos os vetores e em diversas posições, a condição do seu if fica verdadeira.
Crie o vetor apenas com a quantidade de posições que irá preencher:

int [] num = new int[10];  
int [] numdois = new int[5];

E percorra os vetores sempre partindo da posição 0, a inicial:

for(int y=0;y<num.length;y++){...
S

Viva ErickRAR,

O problema é que quando corro o programa dá o seguinte erro…

java.lang.ArrayIndexOutOfBoundsException: 10

at exercicio_10.main(exercicio_10.java:20)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

at java.lang.reflect.Method.invoke(Unknown Source)

at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272)
ErickRAR

Faça o for como eu falei no post anterior. O problema é que você está tentando acessar uma posição que não existe…

você declara um vetor com 10 posições:

int [] vetor = new int[10];

Se você tentar acessar a posicao numero 10, irá aparecer esse erro, pois a posição nao existe.

System.out.println(vetor[10]);//Da esse erro!

A última posição do vetor é [9], pois começa a contar do 0, e[color=red] não [10][/color].
Em algum for você está tentando pegar a posição 10. Como eu disse logo no inicio, faça o for como o meu exemplo, assim ele irá começar do 0 até a ultima posição.

regis_hideki

Além disso, pra saber se um está contido no outro, você precisa de um contador a ser incrementado no último if e retirar o último else. Se o contador terminar a execução encontrando 5 números iguais, é porque o menor está contido no maior.

Para arrays muito grandes, essa abordagem é pouco performática, pois precisa de nm comparações, sendo n e m a quantidade de posições em cada array. Uma alternativa é ordenar os dois vetores antes das comparações. Pensando um pouco, você consegue executar em no máximo n+m comparações. Mesmo a ordenação exigindo nlog(n) + m*log(m), vale a pena para arrays muito grandes.

Criado 29 de janeiro de 2014
Ultima resposta 30 de jan. de 2014
Respostas 4
Participantes 3