Alguien que me ayude para la búsqueda de intersección de dos conjuntos en java

Dados dos conjuntos A, B de números enteros positivos o
nombres, usar los algoritmos de ordenación y búsqueda para determinar la intersección de esos dos conjuntos A\B = {x : x 2 Ay x 2 B}.

Ya tengo codificado por el método de ordenación burbuja solo me falta buscar la intersección de los dos conjuntos.

package practica1;

import java.util.Scanner;
import javax.swing.JOptionPane;

public class Practica1 {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
Scanner entrada = new Scanner (System.in);
int arreglo[], A,B,aux;
A = Integer.parseInt(JOptionPane.showInputDialog("Digite la cantidad de números para conjuto A "));
B = Integer.parseInt(JOptionPane.showInputDialog("Digite la cantidad de números para conjuto B "));
arreglo = new int [A];
arreglo = new int [B];
for(int i=0;i<A;i++){
System.out.print((i+1)+" Ingresa un número: ");
arreglo [i]= entrada.nextInt();
}
for(int i=0;i<(A-1);i++){
for(int j=0;j<(A-1);j++){
if(arreglo[j] >arreglo[j+1]){
aux = arreglo[j];
arreglo[j]= arreglo[j+1];
arreglo[j+1]=aux;
}
}
}
System.out.print("\nConjunto A ordenado es: ");
for(int i=0;i<A;i++){
System.out.print(arreglo[i]+" , ");
}
System.out.println();
System.out.println();
for(int i=0;i<B;i++){
System.out.print((i+1)+" Ingresa un número: ");
arreglo [i]= entrada.nextInt();
}
for(int i=0;i<(B-1);i++){
for(int j=0;j<(B-1);j++){
if(arreglo[j] >arreglo[j+1]){
aux = arreglo[j];
arreglo[j]= arreglo[j+1];
arreglo[j+1]=aux;
}
}
}
System.out.print("\nConjunto B ordenado es: ");
for(int i=0;i<B;i++){
System.out.print(arreglo[i]+" , ");
}
System.out.println();
}

}

Respuesta
2

No se si te permiten usar listas, si es así la solución seria :

    Integer[] conjA = new Integer[] { 1, 2, 3 };
    Integer[] conjB = new Integer[] { 3, 4, 5 };
    // Convertir array en lista
    List<Integer> list = Arrays.asList(conjA);
    // O si insistes en trabajar con int[]
    // List<Integer> list = Arrays.stream(conjA).boxed().collect(Collectors.toList());
    for (int i : conjB) {
      if (list.contains(i)) {
        System.out.println("Forma parte de la intersección: " + i);
      }
    }
    // Si no se te permite trabajar con listas la solucion seria la siguiente:
    for (int i : conjA) {
      for (int j : conjB) {
        if (j == i) {
          System.out.println("Forma parte de la intersección: " + i);
        }
      }
    }

1 respuesta más de otro experto

Respuesta
1

¿A qué te refieres con intersección? Exactamente

Que tal Oscar, la intersección es buscar en dos vectores de A {1, 3, 5,7,9,}  y  B {3,1,8,6,4}

en vector A y en el B hay dos elementos que se repiten que es el 1 y 3  , entonces con el algoritmo de  búsqueda ya sea binaria o de otro método muestre el resultado 1 y 3, en este caso ya tengo el ordenamiento el cual el usuario se le indica que ingrese los elementos de A y B solo me falta búsqueda de los elementos que sean iguales en ambos vectores.

Se lo que es una intersección, pero te pregunto por que si ya tienes el algoritmo que de búsqueda no entiendo como es que no te encuentra los elemtnos que sean iguales en ambos arreglos, no se si lo que buscas es la compararcion entre ambos arreglos y capturar las posiciones en la que los elementos sean los mismos por ejemplo el 1 y el 3, eso se hace con dos ciclos for recorriendo ambos al mismo tiempo y realizando una validación interna en esos ciclos es decir un if donde compare el elemento actual de a al elemento actual de b, no se si eso te sirva.

Realice la búsqueda de las dos conjuntos pero me tira un error al momento de invocar la Intersección.

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import javax.swing.JOptionPane;


public class Practica1 {


public static void main(String[] args) {
// TODO code application logic here
Scanner entrada = new Scanner (System.in);
int arreglo[], A,B,aux;
A = Integer.parseInt(JOptionPane.showInputDialog("Digite la cantidad de números para conjuto A "));
B = Integer.parseInt(JOptionPane.showInputDialog("Digite la cantidad de números para conjuto B "));
arreglo = new int [A];
arreglo = new int [B];
for(int i=0;i<A;i++){
System.out.print((i+1)+" Ingresa un número: ");
arreglo [i]= entrada.nextInt();
}
for(int i=0;i<(A-1);i++){
for(int j=0;j<(A-1);j++){
if(arreglo[j] >arreglo[j+1]){
aux = arreglo[j];
arreglo[j]= arreglo[j+1];
arreglo[j+1]=aux;
}
}
}
System.out.print("\nConjunto A ordenado es: ");
for(int i=0;i<A;i++){
System.out.print(arreglo[i]+" , ");
}
System.out.println();
System.out.println();
for(int i=0;i<B;i++){
System.out.print((i+1)+" Ingresa un número: ");
arreglo [i]= entrada.nextInt();
}
for(int i=0;i<(B-1);i++){
for(int j=0;j<(B-1);j++){
if(arreglo[j] >arreglo[j+1]){
aux = arreglo[j];
arreglo[j]= arreglo[j+1];
arreglo[j+1]=aux;
}
}
}
System.out.print("\nConjunto B ordenado es: ");
for(int i=0;i<B;i++){
System.out.print(arreglo[i]+" , ");
}
System.out.println();
int[] I = Interseccion(A, B);     // en esta linea me tira el error

System.out.println("Iterseccion es:");
for (int i = 0; i < I.length; i++) {

System.out.println(I[i]);
}

}

public static Boolean existe(int[] Conjunto, int Elemento) {

Boolean existe = false;

for (int i = 0; i < Conjunto.length; i++) {
if (Conjunto[i] == Elemento) {
existe = true;
}
}
return existe;
}

public static int[] Interseccion(int[] A, int[] B) {

int c = 0;
for (int i = 0; i < A.length; i++) {
if (existe(A, B[i]) == true) {

c++;
}
}
int[] I = new int[c];
int x = 0;
for (int i = 0; i < A.length; i++) {
if (existe(A, B[i]) == true) {
I[x] = A[i];
x++;
}
}

return I;
}

}

No entiendo como es que no te marca error al asignarle la cantidad total que tendrá cada arreglo ya que mandas llamar al arreglo dos veces por el mismo nombre, pero bueno en la parte de abajo detecto que el método Intersección tiene un error

¿En esta parte que significa existe? ¿O qué quieres validar? En todo caso si quisieras saber si un elemento existente en el arreglo A también esta en el B seria poner dos for, uno con cada arreglo para recorrerlo y en el segundo for validar si el valor de la intentar actual en a[i] es igual == al valor actual de la intentar B b[i] de ser así, ya mandas mensaje o l oque desees hacer pero, tu método Intersección le falta que le asignes una intentar a A[j] así como lo haces con B[i], no debes validar con true si no comparando las posiciones.

for (int i = 0; i < A.length; i++) {
if (existe(A, B[i]) == true) {

c++;
}
}

Seria de esta forma entonces

for (int i = 0; i <A; i++) {
for (int j = 0; j <B; j++) {
}
}

así es y dentro del segundo for valida 

if(a[i] == b[i]){

Si entra aquí es por que el valor es el mismo.

}

Es así como me ha quedado.

obiamente cambia b[i] por b[j] y listo.

Mande a imprimir pero no me sale la intersección

No entiendo por que pones dos if anidados y en el segundo if imprimes solo el valor de a[i], no quedamos así, de esta forma es complicado ayudarte hermano pero espero que mis respuestas te hayan ayudado un poco más, y define bien lo que quieres intersección son los elementos que existen dentro de un rango, y otra cosa distinta es que quieras todas las posiciones que tengan coincidencias entre dos arreglos. Un abrazo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas