JAVA- Arrays retirar iguais

limalhao

Membro
Boas será que alguém me pode ajudar

Estava a fazer um exercicio com arrays mas não consigo acabar o objectivo é ter dois arrays e fazer a intersecção mas retirar todos os iguais e ésta parte que não consigo alguém pode dar um help

Aqui vai o código que já fiz
public static int intersection(int[] v1, int[] v2) {

for( int i=0; i<v1.length; ++i ){
for( int j=0; j<v2.length; ++j ){
if( v2[j]==v1 );

{System.out.println("int v3={" +v1+ "," +j );
break;

Como retiro os valores que forem iguais?
 
Tens que pensar um bocado:P

Crias um array em branco e adicionas os valores que forem iguais a esse array, e pronto.. agora nesse novo array tens os valores iguals:007:
 
Penso que se calhar não me expliquei correctamente o que eu quero é no caso de ter por exemplo num array v1 ={1,2,3,4} e v2={1,1,2,3,5,6} quando faço a intersecção e crio o novo array vai aparecer v3{1,1,2,3} devido aos dois 1 do segundo array e era este segundo 1 que eu queria eliminar
 
AAAAAAAAAAH... uma forma facil é em vez de usares um array usares collections do tipo Set. Este container não deixa duplicar os valores ao contrário de um array normal ou de uma List (que tambem é um container).

Outra forma mais lenta é na altura de fazeres a intersecção veres se ele já existe no array final.
 
Penso que se calhar não me expliquei correctamente o que eu quero é no caso de ter por exemplo num array v1 ={1,2,3,4} e v2={1,1,2,3,5,6} quando faço a intersecção e crio o novo array vai aparecer v3{1,1,2,3} devido aos dois 1 do segundo array e era este segundo 1 que eu queria eliminar

public static int intersection(int[] v1, int[] v2) {
int tamanho;

// porque o array final nao tera mais elementos que o menor array em comparacao
if(v1.length > v2.length)
tamanho = v2.length;
else
tamanho = v1.length;

int []finalarray = new int[tamanho];
int final_pos = 0;

for( int i=0; i<v1.length; ++i ){
for( int j=0; j<v2.length; ++j ){
if( v2[j]==v1 ) {

// vai percorrer o array final ( com os valores repetidos) ate chegar a posição de escrita actual, ou até encontrar um valor ja existente
for(int k=0; k<finalpos && finalarray[k]!=v1;k++);

// guarda o valor se ainda não existir, ou então faz break e passa a proxima comparacao
if(k==final_pos)
finalarray[final_pos++]=v1;
else
break;
}
}
}



P.S.: Eu ja ha algum tempo que nao mexo em java por isso e possivel que haja alguma maneira para simplificar este codigo, mas em principio isto deverá dar :)
Espero ter ajudado

P.S.S.: Os valores de um array de inteiros em java sao inicializados a 0, tanto quanto sei, por isso se existirem 0's nos arrays que estás a comparar, não te esqueças de contar so um e ignorar o resto
 
Boas,

Podes usar o método Arrays.binarySearch(int v[], int key) para verificar se um dado elemento está contido num array. Alternativamente, podes fazer um método bastante mais eficiente para a intersecção se ordenares os dois vectores primeiro (podes usar o método Arrays.sort(int v[]) para ordenar), sendo que a filtragem também seria fácil de fazer desta maneira.
 
Boas,
antes de mais obrigado pela vossa ajuda no entento continuo com duvidas mas agora no codigo postado pelo Dragon_Tamer

for(int k=0; k<finalpos && finalarray[k]!=v1;k++);
:rolleyes:Aqui crio o novo array certo para que serve o e lógico?

// guarda o valor se ainda não existir, ou então faz break e passa a proxima comparacao
if(k==final_pos)
finalarray[final_pos++]=v1;
else
break;
Se fizer aqui um print de finalarray[final_pos++] o que devia verificar era a intersecção dos arrays sem numeros repetidos?

Obrigado
 
Boas,
antes de mais obrigado pela vossa ajuda no entento continuo com duvidas mas agora no codigo postado pelo Dragon_Tamer

for(int k=0; k<finalpos && finalarray[k]!=v1;k++);
:rolleyes:Aqui crio o novo array certo para que serve o e lógico?

// guarda o valor se ainda não existir, ou então faz break e passa a proxima comparacao
if(k==final_pos)
finalarray[final_pos++]=v1;
else
break;
Se fizer aqui um print de finalarray[final_pos++] o que devia verificar era a intersecção dos arrays sem numeros repetidos?

Obrigado



O que vais verificar e um array com a interesecção dos elementos repetidos nos 2 arrays iniciais, com o pormenor que mencionei:

P.S.S.: Os valores de um array de inteiros em java sao inicializados a 0, tanto quanto sei, por isso se existirem 0's nos arrays que estás a comparar, não te esqueças de contar so um e ignorar o resto


Para resolveres isso, caso os valores dos arrays a comparar sao positivos ou estão dentro de um limite definido, basta inicializares o array a um valor que não exista lá, por exemplo -1 caso não existam números negativos nos arrays a comparar. Ou então em vez de um array, usas um vector de inteiros, ficando apenas os elementos que necessitas para isso.
 
Back
Topo