[RESOLVIDO]Classe Vetor Generico e Como usar a ordenação (bubbleSort());

3 respostas
BinhoAraujo

Pessoal,
criei uma classe Vetor Generica:

public class Vetor<T> implements br.com.vector.IVetor<T> {

    T[] vetor;
    int qntElementos = 0;

    public Vetor(int tam) {
        vetor = (T[]) new Object[tam];
    }

    public boolean isEmpty() {
        return Tamanho() == 0;
    }
    
    
    @Override
    public void Adicionar(T elemento) {
        if (Tamanho() == vetor.length) {
            redimensionar();
        }
        for (int i = 0; i < vetor.length; i++) {
            if (vetor[i] == null) {
                vetor[i] = (T) elemento;

                qntElementos++;
                break;
            }
        }

    }
   
    @Override
    public void Adicionar(int posicao, T elemento) throws ArrayIndexOutOfBoundsException {
            redimensionar();
        
        vetor[posicao] = null;
        vetor[posicao] = (T) elemento;
        qntElementos++;
    }

    @Override
    public void AdicionarInicio(T elemento) {
        redimensionar();
        for(int i = Tamanho(); i >= 0; i--){
            vetor[i+1] = vetor[i];
        }
        vetor[0] = elemento;
        qntElementos++;
    }

    @Override
    public void Remover(int posicao) throws ArrayIndexOutOfBoundsException {
        if (isEmpty()) {
            throw new ArrayIndexOutOfBoundsException("Vazio");
        }
        if (posicao < vetor.length) {
            vetor[posicao] = null;
            qntElementos--;
        } else {
            System.out.println("Posição inexistente!!!");
        }
    }

    @Override
    public void Remover(T elemento) {
        if (contem(elemento) == false) {
            System.out.println("Elemento nao encontrado!!!");
        }
        for (int i = 0; i < vetor.length; i++) {
            if (vetor[i].equals(elemento)) {
                vetor[i] = null;
                break;
            }
            
        }

    }

    @Override
    public void RemoverInicio() {
        if (isEmpty()) {
            System.out.println("Vetor vazio!");
        }
        for (int i = 0; i < vetor.length; i++) {
            if (vetor[i] != null) {
                vetor[i] = null;
                break;

            }
            qntElementos--;
        }
    }

    @Override
    public void RemoverFim() {
        if (isEmpty()) {
            System.out.println("Vetor vazio!");
        }
        for (int i = 0; i < vetor.length; i++) {
            if (vetor[i] == null) {
                vetor[i - 1] = null;
            }
            qntElementos--;
            break;
        }
        vetor[Tamanho()] = null;
    }

    @Override
    public int Tamanho() {
        return qntElementos;
    }

    @Override
    public void Limpar() {

        for (int i = 0; i < vetor.length; i++) {
            if (vetor[i] != null) {
                vetor[i] = null;
                qntElementos--;
            }
            
        }
    }

    @Override
    public boolean contem(T elemento) {
        for (int i = 0; i < vetor.length; i++) {
            if (elemento.equals(vetor[i])) {
                return true;
            }
        }
        return false;
    } 
    
    public void imprimir() {
    
        for (T elemento : vetor) {
            System.out.println(elemento);
        }
    }
    
    public String toString(){
        StringBuilder sb = new StringBuilder();
            sb.append("[");
            for(int i =0; i < Tamanho(); i++){
                sb.append(vetor[i]);
                sb.append(" ");
            }
            sb.append("]");
            
            return sb.toString();
    }
    
    public void redimensionar(){
        T[] novoVetor = (T[]) new Object[vetor.length * 2];
        if(vetor.length == Tamanho()){
            
            for(int i =0; i < vetor.length; i++){
                novoVetor[i] = vetor[i];
            }
            vetor = novoVetor;
        }
        
    }

    @Override
    public boolean equals(Object obj) {
        if(vetor.getClass() == obj.getClass()){
            return true;
        }else{
            return false;
        }
    }
}

e gostaria de saber como usar a classe ordenação, essa não criei:

public class Sorte {

        public static void bolha(Object[] a, Comparator c) {
            int fim;
            boolean troquei;
            Object temp;

            fim = a.length - 1;
            do {
                troquei = false;
                for (int i = 0; i <= fim - 1; i++) {
                    if (c.compare(a[i], a[i + 1]) > 0) {
                        temp = a[i];
                        a[i] = a[i + 1];
                        a[i + 1] = temp;
                        troquei = true;
                    }
                }
                fim--;
            } while (troquei);
        }

        public static void selecao(Object[] a, Comparator c) {
            int k, iMenor;
            Object temp;

            for (int i = 0; i < +a.length; i++) {
                iMenor = i;
                for (k = i + 1; k <= a.length - 1; k++) {
                    if (c.compare(a[k], a[iMenor]) < 0) {  //Comparacao " < 0 " serve para listar em ordem decrescente
                        iMenor = k;
                    }
                }
                temp = a[i];
                a[i] = a[iMenor];
                a[iMenor] = temp;
            }
        }

        public static void insercao(Object[] a, Comparator c) {
            int k;
            Object temp;

            for (int i = 0; i <= a.length - 1; i++) {
                k = i;
                temp = a[i];

                while ((k > 0) && (c.compare(temp, a[k - 1]) < 0)) {
                    a[k] = a[k - 1];
                    k--;
                }
                a[k] = temp;
            }
        }
        public static final Random random = new Random();

        private static void trocar(Object[] a, int i, int j) {
            Object temp = a[i];
            a[i] = a[j];
            a[j] = temp;
        }

        private static int particao(Object[] a, Comparator c, int primeiro, int ultimo) {
            int x = primeiro + random.nextInt(ultimo - primeiro + 1);
            //System.out.println("X: " + x);
            Object pivo = a[x];
            trocar(a, x, ultimo);
            for (int i = x = primeiro; i < ultimo; ++i) {
                if (c.compare(a[i], pivo) <= 0) {
                    trocar(a, x++, i);
                }
            }
            trocar(a, x, ultimo);
            return (x);
        }

        private static void Sort(Object[] a, Comparator c, int primeiro, int ultimo) {
            if (ultimo > primeiro) {
                int x = particao(a, c, primeiro, ultimo);
                Sort(a, c, primeiro, x - 1);
                Sort(a, c, x + 1, ultimo);
            }
        }

        public static void quickSort(Object[] a, Comparator c) {
            Sort(a, c, 0, a.length - 1);
        }
    }

Estou tentando usar assim: - Mas não sei qual o segundo parametro que devo usar:

Vetor<Integer> vetor = new Vetor(5);

        vetor.Adicionar(6);
        vetor.Adicionar(3);
        vetor.Adicionar(9);
        vetor.Adicionar(2);
        vetor.Adicionar(4);
      
        System.out.println(vetor.toString());
        System.out.println("");
        
        Sorte.bolha(vetor, \\Aqui não sei o qual usar\\);

3 Respostas

BinhoAraujo

Ninguem pra ajudar?

Rodrigo_Sasaki

Bom, você tem uns problemas aí. Antes de tudo recomendo fortemente que siga os padrões Java de nomeação, como começar os métodos com letra minúscula.

Agora ao problema de verdade:

Você quer ordenar o seu array, imagino que de uma maneira genérica. Mas vamos pensar um pouco sobre isso. Se você quer ordenar os elementos de uma coleção, quer dizer que esses elementos tem que ser comparáveis de alguma forma. De algum jeito você tem que poder dizer que um é maior do que o outro. E a linguagem Java tem 2 mecanismos prontos para isso. As interfaces Comparable e Comparator.

Na primeira você "ensina" a própria classe a se comparar com outros elementos do mesmo tipo, através do método compareTo, já no outro você cria uma classe externa que recebe 2 instâncias do mesmo tipo e diz qual é a maior, isso é feito através do método compare

Então perceba que para seu método de ordenação funcionar, você precisa exigir que ele ou receba uma coleção de objetos que implementam Comprable ou receba junto um Comparator que saiba comparar objetos do tipo da coleção.

Você pode definir essa obrigatoriedade utilizando generics, segue um exemplo:
public class Sort {

    public static <T extends Comparable<T>> void bubble(Vetor<T> vetor){ 
        // Sua implementação
    }

    public static <T> void bubble(Vetor<T> vetor, Comparator<T> comparator){
        // Sua implementação
    }

}
Fez sentido?
BinhoAraujo

Valeu Rodrigo, consegui aqui, olhando o que voce postou e umas dicas que o Vini tinha me passado em outro topico,
muito obrigado!

Não usei a segunda classe, criei esse Bolha dentro da classe Vetor mesmo.

public void Bolha(){
            int fim;
            boolean troquei;
            T temp;

            fim = qntElementos - 1;
            do {
                troquei = false;
                for (int i = 0; i <= fim - 1; i++) {
                    if (vetor[i].compareTo(vetor[i + 1]) == 1) {
                        temp = vetor[i];
                        vetor[i] = vetor[i + 1];
                        vetor[i + 1] = temp;
                        troquei = true;
                    }
                }
                fim--;
            } while (troquei);
        
    }
Rodrigo Sasaki:
Bom, você tem uns problemas aí. Antes de tudo recomendo fortemente que siga os padrões Java de nomeação, como começar os métodos com letra minúscula.

Agora ao problema de verdade:

Você quer ordenar o seu array, imagino que de uma maneira genérica. Mas vamos pensar um pouco sobre isso. Se você quer ordenar os elementos de uma coleção, quer dizer que esses elementos tem que ser comparáveis de alguma forma. De algum jeito você tem que poder dizer que um é maior do que o outro. E a linguagem Java tem 2 mecanismos prontos para isso. As interfaces Comparable e Comparator.

Na primeira você "ensina" a própria classe a se comparar com outros elementos do mesmo tipo, através do método compareTo, já no outro você cria uma classe externa que recebe 2 instâncias do mesmo tipo e diz qual é a maior, isso é feito através do método compare

Então perceba que para seu método de ordenação funcionar, você precisa exigir que ele ou receba uma coleção de objetos que implementam Comprable ou receba junto um Comparator que saiba comparar objetos do tipo da coleção.

Você pode definir essa obrigatoriedade utilizando generics, segue um exemplo:
public class Sort {

    public static <T extends Comparable<T>> void bubble(Vetor<T> vetor){ 
        // Sua implementação
    }

    public static <T> void bubble(Vetor<T> vetor, Comparator<T> comparator){
        // Sua implementação
    }

}
Fez sentido?
Criado 30 de maio de 2014
Ultima resposta 6 de jun. de 2014
Respostas 3
Participantes 2