Verificando se uma lista é classificada em Java

Verificando se uma lista é classificada em Java

1. Visão geral

Neste tutorial, veremosdifferent ways to check if a list is sorted in Java.

2. Abordagem Iterativa

A abordagem iterativa é uma maneira simples e intuitiva de verificar uma lista classificada. Nesta abordagem, iremos iterar a lista e comparar os elementos adjacentes. Se algum dos dois elementos adjacentes não estiver classificado, podemos dizer que a lista não está classificada.

Uma lista pode ser classificada na ordem natural ou em uma ordem personalizada. Cobriremos esses dois casos usando as interfacesComparableeComparator.

2.1. UsandoComparable

Primeiro, vamos ver umexample of a list whose elements are of type Comparable. Aqui, vamos considerar uma lista contendo objetos do tipoString:

public static boolean isSorted(List listOfStrings) {
    if (isEmpty(listOfStrings) || listOfStrings.size() == 1) {
        return true;
    }

    Iterator iter = listOfStrings.iterator();
    String current, previous = iter.next();
    while (iter.hasNext()) {
        current = iter.next();
        if (previous.compareTo(current) > 0) {
            return false;
        }
        previous = current;
    }
    return true;
}

2.2. UsandoComparator

Agora, vamos considerar uma classeEmployee, que não implementaComparable. Portanto, neste caso, precisamos usar umComparator para comparar os elementos adjacentes da lista:

public static boolean isSorted(List employees, Comparator employeeComparator) {
    if (isEmpty(employees) || employees.size() == 1) {
        return true;
    }

    Iterator iter = employees.iterator();
    Employee current, previous = iter.next();
    while (iter.hasNext()) {
        current = iter.next();
        if (employeeComparator.compare(previous, current) > 0) {
            return false;
        }
        previous = current;
    }
    return true;
}

Os dois exemplos acima são semelhantes. A única diferença está na forma como comparamos os elementos anteriores e os atuais da lista.

Além disso,we can also use Comparator to have precise control over the sorting check. Mais informações sobre esses dois estão disponíveis em nosso tutorialComparator and Comparable in Java.

3. Abordagem Recursiva

Agora, veremos como verificar uma lista classificada usando recursão:

public static boolean isSorted(List listOfStrings) {
    return isSorted(listOfStrings, listOfStrings.size());
}

public static boolean isSorted(List listOfStrings, int index) {
    if (index < 2) {
        return true;
    } else if (listOfStrings.get(index - 2).compareTo(listOfStrings.get(index - 1)) > 0) {
        return false;
    } else {
        return isSorted(listOfStrings, index - 1);
    }
}

4. Usando goiaba

Muitas vezes, é bom usar uma biblioteca de terceiros em vez de escrever nossa própria lógica. A biblioteca do Guava possui algumas classes de utilitários que podemos usar para verificar se uma lista está classificada.

4.1. Classe GoiabaOrdering

Nesta seção, veremos como usar a classeOrdering no Guava para verificar se há uma lista classificada.

Primeiro, veremos um exemplo de uma lista contendo elementos do tipoComparable:

public static boolean isSorted(List listOfStrings) {
    return Ordering. natural().isOrdered(listOfStrings);
}

A seguir, veremos como podemos verificar se uma lista de objetosEmployee é classificada usando umComparator:

public static boolean isSorted(List employees, Comparator employeeComparator) {
    return Ordering.from(employeeComparator).isOrdered(employees);
}

Além disso, podemos usarnatural().reverseOrder() para verificar se uma lista está classificada na ordem inversa. Além disso, podemos usarnatural().nullFirst()enatural().nullLast() para verificar senull aparece no primeiro ou no último da lista classificada.

Para saber mais sobre a classe GuavaOrdering, podemos consultar nosso artigoGuide to Guava’s Ordering.

4.2. Classe GoiabaComparators

Se estivermos usando Java 8 ou superior, o Guava fornece uma alternativa melhor em termos de classeComparators. Veremos um exemplo deusing the isInOrder method desta classe:

public static boolean isSorted(List listOfStrings) {
    return Comparators.isInOrder(listOfStrings, Comparator. naturalOrder());
}

Como podemos ver, no exemplo acima, usamos a ordem natural para verificar se há uma lista classificada. Também podemos usarComparator para personalizar a verificação de classificação.

5. Conclusão

Neste artigo, vimos como podemos verificar uma lista classificada usando uma abordagem iterativa simples, uma abordagem recursiva e usando Guava. Também abordamos brevemente o uso deComparatoreComparable para decidir a lógica de verificação de classificação.

A implementação de todos esses exemplos e trechos de código pode ser encontradaover on GitHub.