Merge sorted Java (RESOLVIDO)

Olá pessoal, preciso realizar um merge em java, com valores de uma Instância de uma classe, Fila a e Fila b, fiz um método inserir(), na classe Fila. e gostaria de acessar os valores de a e b. E atribuir esses valores, a uma outra Instância da classe Fila, tipo Fila c = new Fila(recebe os valores de A e B). Mais não tenho muito ideia de fazer isso, agradeço qualquer tipo de ajuda.

fila

public class Fila {

private int remove;
private int max = 0;
private int dado[];

public Fila(int tamanhoFila) {
    this.dado = new int[tamanhoFila];
    this.remove = 0;
}

Fila() {
    this(3);
}

public void insere(Fila f, int elemento) {
    if (this.max < this.dado.length) {
        this.dado[this.max] = elemento;
        this.max++;
    }
}

public void cheia(){
    if(this.max == this.dado.length){
        System.out.println("A Fila esta cheia");
    } else{
        System.out.println("A Fila não esta cheia");
    }
}

public boolean vazia( ){
    if(this.max == 0){
        return true;
    }
    return false;
}

public Object primeiro(){
    if (this.vazia()){
        return "A fila esta vazia !";
    }
    
    return this.dado[0];
}

public Object ultimo(){
    return this.dado[--max];
}

public Object remove() {
    int pos = 0;
    int removeElemento = this.dado[pos];

    for (int i = pos; i < this.max - 1; i++) {
        dado[i] = dado[i+1];
    }
    this.max--;
    
    return removeElemento;
    
}



@Override
public String toString() {
    StringBuilder s = new StringBuilder();
    
    for (int i = 0; i <this.max; i++) {
       s.append(this.dado[i]);
       s.append(" ");
    }
    return s.toString();
    
}
public class Executa {

    public static void main(String[] args) {
        Fila a = new Fila(4);
        Fila b = new Fila(5);
        Fila c = new Fila(9);

        a.insere(12);
        a.insere(35);
        a.insere(52);
        a.insere(64);


        b.insere(05);
        b.insere(15);
        b.insere(23);
        b.insere(55);
        b.insere(75);



    }

}

Não sei se entendi muito bem. “Fila” é basicamente um array ordenado (pelo exemplo da imagem) e você precisa unir esses dois arrays num novo array de forma ordenada?

1 curtida

Postei o código para entender melhor, eu tenho um método inserir, que insere valores de A e B, gostaria de colocar esses valores, dentro de uma Fila C, e ordenar eles de forma crescente.

Acrescenta esses dois métodos na sua classe Fila:

public static Fila merge(Fila filaA, Fila filaB) {
    Fila filaC = new Fila(filaA.dado.length + filaB.dado.length);

    int proximoA = 0;
    int proximoB = 0;
    int proximoC = 0;

    while (proximoA < filaA.dado.length && proximoB < filaB.dado.length) {
        if (filaA.dado[proximoA] <= filaB.dado[proximoB]) {
            filaC.dado[proximoC++] = filaA.dado[proximoA++];
        } else {
            filaC.dado[proximoC++] = filaB.dado[proximoB++];
        }
    }

    while (proximoA < filaA.dado.length) {
        filaC.dado[proximoC++] = filaA.dado[proximoA++];
    }

    while (proximoB < filaB.dado.length) {
        filaC.dado[proximoC++] = filaB.dado[proximoB++];
    }

    return filaC;
}

public void mostrarElementosDaFila() {
    for (int elemento : dado) {
        System.out.print(elemento + " ");
    }
    System.out.println();
}

Aí você pode testar num método main dessa forma:

public static void main(String[] args) throws IOException {
    Fila filaA = new Fila(4);

    filaA.insere(filaA, 12);
    filaA.insere(filaA, 35);
    filaA.insere(filaA, 52);
    filaA.insere(filaA, 64);

    Fila filaB = new Fila(5);

    filaB.insere(filaB, 5);
    filaB.insere(filaB, 15);
    filaB.insere(filaB, 23);
    filaB.insere(filaB, 55);
    filaB.insere(filaB, 75);

    Fila filaMergeada = Fila.merge(filaA, filaB);

    filaMergeada.mostrarElementosDaFila();
}

Resultado:

Ordenadinho :slight_smile:
Screenshot%20from%202019-03-18%2011-06-37

E, detalhe, não tem necessidade do parâmetro Fila f no método insere. Só mantive pra deixar compatível com o seu código.

1 curtida

Muito obrigado pela resolução, com os valores informados deu tudo certo, mais no momento em que altero os valores, ele ordena alguns números de forma errada. Saberia informar o erro ?

Como assim altera os valores? Pode me mostrar exatamente o que você fez?

1 curtida

public static void main(String[] args) {

    Fila filaA = new Fila(4);
    Fila filaB = new Fila(5);

    filaA.insere(2);
    filaA.insere(4);
    filaA.insere(5);
    filaA.insere(6);

    filaB.insere(9);
    filaB.insere(1);
    filaB.insere(10);
    filaB.insere(3);
    filaB.insere(12);
    
    Fila filaMergeada = Fila.merge(filaA, filaB);

    filaMergeada.mostrarElementosDaFila();

}

aa

Esta ordenando de forma incorreta, nesse exemplo da foto

Mas no seu exemplo a sua filaB não está ordenada, né. Pelo exemplo da imagem que você deu, eu considerei que as filas que serão mergeadas sempre viriam ordenadas. Não é o caso, então?

Sim, o enunciado da questão especifica que as duas entradas são ordenadas. Então, o código que te mandei já atende isso.

1 curtida