Ordenação de Lista [RESOLVIDO]

2 respostas
M

Preciso criar uma função que recebe uma lista já ordenada e quantidade de colunas para imprimir.
ex1: 5 colunas e a lista = [1,2,3,4,5,6,7]

Se eu imprimir esta lista. Sai assim:
1 2 3 4 5
6 7

Preciso que imprima assim:
1 3 5 7
2 4 6
ou seja, para conseguir imprimir assim, preciso que a lista esteja ordenada deste jeito: [1,3,5,7,2,4,6].
Então preciso criar uma função generica que retorna a lista já ordenada para impressão e passe por parametro a lista e o numero de colunas para impressão.

ex2:
List [1,2,3,4,5,6]. 2 Colunas

1 4
2 5
3 6
Lista ordenada = [1,4,2,5,3,6].

ex3:
List [1,2,3,4,5,6,7,8,9,10]. 3 Colunas

1 5 8
2 6 9
3 7 10
4
Lista ordenada = [1,5,8,2,6,9,3,7,10,4].

Entenderão o que é para fazer???

O mais perto que consegui fazer é se o numero de registro da lista for divisível pelo numero de colunas(ex2). Ai funciona. Porém se manda com numero quebrado(ex1, ex2), ai ele ordena para ordem inicial dnvo ‘-’

Codigo:

public static <T> List<T> quebrarLista(List<T> lst, int numeroQuebra) {
        
        int numeroRegistro = Math.round(lst.size()/numeroQuebra);
        List<List<T>> arrays = new ArrayList<List<T>>();
        int indice1 = 0;
        int indice2 = numeroRegistro;
        for (int i = 0; i < numeroQuebra; i++) {
            arrays.add(new ArrayList<T>(lst.subList(indice1, indice2)));
            indice1 = indice2;
            indice2 = indice2 + numeroRegistro;
        }
        
        List<T> lstNaoContem = new ArrayList<T>(lst);
        for (List<T> list : arrays) {
            lstNaoContem.removeAll(list);
        }
        for (int i = 0; i < lstNaoContem.size(); i++) {
            arrays.get(i).add(lstNaoContem.get(i));
        }
        
        List<T> novo = new ArrayList<T>();
        for (int i = 0; i < arrays.get(0).size(); i++) {
            for (int j = 0; j < numeroQuebra; j++) {
                if (arrays.get(j).size() > i ) {
                    novo.add(arrays.get(j).get(i));
                }
            }
        }
        return novo;
    }

2 Respostas

J

Olá,

Você pode definir o número de linhas que vai ter, vai ajudar bastante.

O número de linhas será o menor inteiro maior que o número de elementos dividido pelo número de colunas, chamado de “ceil”.

Sabendo o número de linhas ( Math.ceil(nElementos/nColunas) ) você pode dividir essa lista por linhas e depois juntá-las.

M

Solução:

if (lst == null || lst.isEmpty() || lst.size() == 1) {
            return lst;
        }
        //int resto = lst.size() % numeroQuebra;
        List<List<T>> arrays = new ArrayList<List<T>>();
        int indice1 = 0;
        int indice2 = 0;
        int numeroRegistro = 0;
        for (int i = 0; i < numeroQuebra; i++) {
            int resto = (lst.size() - indice2) % (numeroQuebra - arrays.size());
            numeroRegistro = Math.round(((lst.size() - indice2) / (numeroQuebra - arrays.size())));
            if (resto != 0) {
                numeroRegistro++;
            }
            indice2 = indice1 + numeroRegistro;
            arrays.add(new ArrayList<T>(lst.subList(indice1, indice2)));
            indice1 = indice2;
        }

        List<T> novo = new ArrayList<T>();
        for (int i = 0; i < arrays.get(0).size(); i++) {
            for (int j = 0; j < numeroQuebra; j++) {
                if (arrays.get(j).size() > i) {
                    novo.add(arrays.get(j).get(i));
                }
            }
        }
        return novo;
Criado 28 de maio de 2013
Ultima resposta 14 de jun. de 2013
Respostas 2
Participantes 2