Comparar arrays

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…

[code]
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
  }
}[/code]

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

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++){...

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

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.

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.