Вы (все еще) не можете выбрать позицию столбца, используя ALTER TABLE: его можно добавить только в конец таблицы. Очевидно, вы можете выбирать столбцы в любом порядке, поэтому, если вы не используете порядок столбцов SELECT * FROM, это не должно быть большой проблемой.
Если вы действительно должны иметь их в определенном порядке, и вы можете 't удалять и воссоздавать таблицу, тогда вы могли бы сбросить и воссоздать столбцы: -
Сначала скопируйте таблицу
CREATE TABLE my_tab_temp AS SELECT * FROM my_tab ;
Затем отпустите столбцы, которые вы хотите после столбца, который вы вставляете
ALTER TABLE my_tab DROP COLUMN три;
Теперь добавьте новый столбец (два в этом примере) и те, которые вы удалили.
ALTER TABLE my_tab ADD (два НОМЕРА (2), три КОЛИЧЕСТВО (10));
Наконец, добавьте обратно данные для вновь созданных столбцов
UPDATE my_tab SET my_tab.three = (SELECT my_tab_temp.three FROM my_tab_temp WHERE my_tab.one = my_tab_temp.one);
Очевидно, что ваше обновление, скорее всего, будет более сложным, и вам придется обрабатывать индексы и ограничения и не сможет использовать это в некоторых случаях (столбцы LOB и т. д.). Плюс это довольно отвратительный способ сделать это, но таблица всегда будет существовать, и вы получите столбцы в нужном вам порядке. Но действительно ли порядок столбцов имеет значение?
Создайте подходящий Comparator
, который будет сравнивать два элемента в соответствии с вашими желаемыми критериями. Затем используйте Collections.sort()
в вашем ArrayList.
Если позднее вы хотите отсортировать по другим критериям, вызовите Collections.sort()
снова с другим Comparator
.
Sun посвятила большую часть своего учебника сортировке в сборниках Java: http://download.oracle.com/javase/tutorial/collections/interfaces/order.html
Он обсуждает с примерами оба интерфейса Comparable и Comparator.
Если вы (почти) всегда хотите использовать этот порядок, вы можете добавить интерфейс Comparable в Quote и реализовать метод compareTo.
public int compareTo(Quote quote) {
int result = this.getName().compareTo(quote.getName());
if (result == 0) {
result = this.getChange().compareTo(quote.getChange());
}
if (result == 0) {
result = this.getPercentChange().compareTo(quote.getPercentChange());
}
return result;
}
Затем используйте отсортированную коллекцию или отсортируйте список и кавычки будут отсортированы.
Для специальной сортировки лучше использовать отдельный, возможно, анонимный Comparator.
Все правы, что вы хотите использовать компараторы. Расширяя эту идею, если вы хотите иметь возможность сортировать по нескольким критериям, то для вас будет работать такой класс:
public class MultiComparator<T> implements Comparator<T> {
private List<Comparator<T>> comparators;
public MultiComparator(List<Comparator<T>> comparators) {
this.comparators = comparators;
}
public int compare(T o1, T o2) {
for (Comparator<T> comparator : comparators) {
int comparison = comparator.compare(o1, o2);
if (comparison != 0) return comparison;
}
return 0;
}
}
Затем вы просто пишете действительно простые компараторы для любых полей, которые вы хотите, и вы можете более легко комбинировать их с более сложными компараторами и с большим повторным использованием.
person.birthdate()
, то общая сложность должна оставаться рядом с этим уровнем.Если первый компаратор вряд ли будет дифференцировать объекты (например, person.sex()
), то вы будете приближаться ближе до 2n * log (n).
– romacafe
13 November 2015 в 23:53
Посмотрите на ComparatorChain из коллекции Apache Commons. Это должно выполнить эту работу. Не реализуйте логику, если она уже доступна и протестирована. На следующем сайте у меня есть учебник: Сортировка объектов по нескольким атрибутам "
См. Collections.sort с явным компаратором (или классом Collections.sort, который требует ввода для реализации Comparable , если вы предпочитаете).