На Java проверить элементы списка на нарушение естественного порядка сортировки (Natural Sort Order)
Я пишу метод, который проверяет порядок элементов входного списка и в случае, если элемент не нарушает естественный порядок сортировки (т.е. больше или равен предыдущему), добавляет в другой список.
Данные во входном списке могут быть или Integer, или String (предварительно я отсеиваю из списка строки, которые не соответствуют указанному типу данных, так что в списке лишь строки, которые можно привести к Integer или те, что нельзя). Я храню данные в списке, параметризированном типом String, потому что любой тип можно привести к строке. Вот что у меня получается:
private static void checkOrder(List<String> firstList) {
// предыдущий элемент списка
String previous = null;
if (getDataType() == DataType.INTEGER) { // режим работы с целыми числами
for (String i: firstList) {
if (previous == null ||
(Integer.parseInt(i) - Integer.parseInt(previous) >= 0)) {
secondList.add(i); // List<String> secondList = new ArrayList<>();
previous = i;
}
}
}
else { // DataType.STRING
for (String i: firstList) {
if (previous == null || i.compareTo(previous) >= 0) {
secondList.add(i);
previous = i;
}
}
}
}
Увы, но это работает не совсем корректно. Так, если работаем с данными типа String и в firstList данные: [img4, img30, abc, z2, z10] , то в secondList окажется: [img4, z2], а не [img4, img30, z2, z10]
Кроме того, что не получается "починить" метод, хотелось бы написать его более красиво и толково. В идеале мне хотелось бы создать единую проверку, которой было бы все равно, Integer в firstList или String.
Вот что я так же безуспешно пробовал по совету интырнета:
private static <T extends Comparable<? super T>> void checkOrder(List<T> firstList) {
T previous = null;
for (T i: firstList) {
if (previous == null || i.compareTo(previous) >= 0) {
allValidData.add((String) element);
previousElement = element;
}
}
}
Но это некорректно работает уже не только с данными типа String, но и с данными типа Integer.
Буду благодарен, если кто-нибудь любезно наставит на путь истинный.