Сортировка элемента в ArrayList без использования метода Collections [duplicate]

Вы (все еще) не можете выбрать позицию столбца, используя 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 и т. д.). Плюс это довольно отвратительный способ сделать это, но таблица всегда будет существовать, и вы получите столбцы в нужном вам порядке. Но действительно ли порядок столбцов имеет значение?

7
задан Sheehan Alam 13 September 2010 в 23:10
поделиться

6 ответов

Создайте подходящий Comparator , который будет сравнивать два элемента в соответствии с вашими желаемыми критериями. Затем используйте Collections.sort() в вашем ArrayList.

Если позднее вы хотите отсортировать по другим критериям, вызовите Collections.sort() снова с другим Comparator.

9
ответ дан gpeche 17 August 2018 в 10:43
поделиться
  • 1
    Можете ли вы привести пример того, как может выглядеть мой метод compare ()? – Sheehan Alam 13 September 2010 в 23:37
  • 2
    @Sheehan Документация объясняет контракт. Это зависит от вас, чтобы определить порядок. Подумайте об этом так же, как поиск книги в библиотеке, например. сначала вы переходите к разделу «Художественная литература». или "Non-Fiction" раздел, то вы просматриваете все число, затем часть после десятичного числа ... например. вы сравниваете "более значимые" прежде всего, и продолжайте сужаться. Если одна более значимая часть больше, чем другая, то это завершает упорядочение (как вы уже нашли лучший порядок). – user 14 September 2010 в 00:01
  • 3
    Этот ответ не работает для меня, у меня два столбца, сначала я хотел бы сортировать arraylist на основе столбцов один за ним, я хотел бы сортировать по столбцам два, но он не работает должным образом, и мой arraylist отсортирован по столбцам два тотальных! – Muhammad Ali 13 December 2016 в 12:57

Sun посвятила большую часть своего учебника сортировке в сборниках Java: http://download.oracle.com/javase/tutorial/collections/interfaces/order.html

Он обсуждает с примерами оба интерфейса Comparable и Comparator.

5
ответ дан Nikita Rybak 17 August 2018 в 10:43
поделиться

Если вы (почти) всегда хотите использовать этот порядок, вы можете добавить интерфейс 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.

28
ответ дан Peter Tillemans 17 August 2018 в 10:43
поделиться
  • 1
    для «Для специальной сортировки лучше использовать отдельный, возможно, анонимный компаратор». +1 – user3437460 16 June 2015 в 20:32

Все правы, что вы хотите использовать компараторы. Расширяя эту идею, если вы хотите иметь возможность сортировать по нескольким критериям, то для вас будет работать такой класс:

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;
    }
}

Затем вы просто пишете действительно простые компараторы для любых полей, которые вы хотите, и вы можете более легко комбинировать их с более сложными компараторами и с большим повторным использованием.

14
ответ дан romacafe 17 August 2018 в 10:43
поделиться
  • 1
    Если есть много сравнений, которые должны быть сделаны, и производительность является проблемой, частный список & lt; Comparator & gt; & gt; & gt; может быть сохранен как массив Comparator [] (он устанавливается один раз в конструкторе, никогда не изменяется и никогда не читается клиентами) - по крайней мере, делает его окончательным. – Jason S 13 September 2010 в 23:46
  • 2
    Согласен, или, может быть, класс может быть окончательным. Я в значительной степени просто написал, что холодно, чтобы продемонстрировать эту идею. В JDK действительно должно быть что-то вроде этого, и я был бы удивлен, если бы его не было в любом количестве библиотек коллекций ... – romacafe 14 September 2010 в 00:01
  • 3
    Какова была бы сложность такого рода компараторов? Разве мы по существу сортируем каждую цепочку компараторов? Итак, мы выполняем операцию n * log (n) для каждого компаратора? – John Baum 10 November 2015 в 17:53
  • 4
    Это возвращается, как только компаратор определяет разницу, так что это действительно зависит от того, что такое компараторы. Основная сложность определяется алгоритмом сортировки, а не компаратором. Предполагая хороший сорт и "одиночный" компаратор, сложность должна быть около n * log (n). Если первый компаратор может дифференцировать два объекта (например, person.birthdate(), то общая сложность должна оставаться рядом с этим уровнем.Если первый компаратор вряд ли будет дифференцировать объекты (например, person.sex()), то вы будете приближаться ближе до 2n * log (n). – romacafe 13 November 2015 в 23:53
  • 5

Посмотрите на ComparatorChain из коллекции Apache Commons. Это должно выполнить эту работу. Не реализуйте логику, если она уже доступна и протестирована. На следующем сайте у меня есть учебник: Сортировка объектов по нескольким атрибутам "

11
ответ дан strangeoptics 17 August 2018 в 10:43
поделиться
  • 1
    +1 Спасибо за это. Необходимость прибегнуть к сторонней библиотеке для этого - IMHO - огромный недостаток языка программирования Java. Я согласен со страннотикой, не развертываю вашу собственную реализацию, когда есть библиотека, которая может это сделать. Прямая ссылка на бесплатный класс ComparatorChain: jarvana.com/jarvana/view/commons-collections/… – Moritz 10 January 2013 в 15:21
  • 2
    Спасибо, что предложили пример кода, чтобы продемонстрировать концепцию. Это (в сочетании с вашей статьей) является отличным ответом на вопрос OP. – John Ward 30 January 2017 в 18:05

См. Collections.sort с явным компаратором (или классом Collections.sort, который требует ввода для реализации Comparable , если вы предпочитаете).

2
ответ дан user 17 August 2018 в 10:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: