Я хочу сортировать импортированный ArrayList файлов в JavaFX [duplicate]

Вы также можете сделать это с помощью одного запроса, используя соединение так:

UPDATE table1,table2 SET table1.col=a,table2.col2=b
WHERE items.id=month.id;

И тогда просто отправьте этот один запрос, конечно. Вы можете узнать больше о объединениях здесь: http://dev.mysql.com/doc/refman/5.0/ru/join.html . Также есть несколько ограничений для заказа и ограничения на несколько обновлений таблиц, которые вы можете прочитать здесь: http://dev.mysql.com/doc/refman/5.0/en/update.html (просто ctrl + f "join").

98
задан Dukeling 13 September 2017 в 13:44
поделиться

9 ответов

Вот инструкция по упорядочению объектов:

Хотя я дам некоторые примеры, я бы порекомендовал его прочитать в любом случае.


Существует несколько способов сортировки ArrayList. Если вы хотите определить естественный (по умолчанию) порядок, то вам нужно позволить Contact реализовать Comparable . Предполагая, что вы хотите сортировать по умолчанию на name, тогда do (nullchecks опущено для простоты):

public class Contact implements Comparable<Contact> {

    private String name;
    private String phone;
    private Address address;

    public int compareTo(Contact other) {
        return name.compareTo(other.name);
    }

    // Add/generate getters/setters and other boilerplate.
}

, чтобы вы могли просто сделать

List<Contact> contacts = new ArrayList<Contact>();
// Fill it.

Collections.sort(contacts);

Если вы хотите определить внешний управляемый порядок (который переопределяет естественный порядок), вам необходимо создать Comparator :

List<Contact> contacts = new ArrayList<Contact>();
// Fill it.

// Now sort by address instead of name (default).
Collections.sort(contacts, new Comparator<Contact>() {
    public int compare(Contact one, Contact other) {
        return one.getAddress().compareTo(other.getAddress());
    }
}); 

. Вы можете даже определите Comparator s в самом Contact, чтобы вы могли повторно использовать их вместо их воссоздания каждый раз:

public class Contact {

    private String name;
    private String phone;
    private Address address;

    // ...

    public static Comparator<Contact> COMPARE_BY_PHONE = new Comparator<Contact>() {
        public int compare(Contact one, Contact other) {
            return one.phone.compareTo(other.phone);
        }
    };

    public static Comparator<Contact> COMPARE_BY_ADDRESS = new Comparator<Contact>() {
        public int compare(Contact one, Contact other) {
            return one.address.compareTo(other.address);
        }
    };

}

, который можно использовать следующим образом:

List<Contact> contacts = new ArrayList<Contact>();
// Fill it.

// Sort by address.
Collections.sort(contacts, Contact.COMPARE_BY_ADDRESS);

// Sort later by phone.
Collections.sort(contacts, Contact.COMPARE_BY_PHONE);
< hr>

И чтобы сливать верх, вы можете использовать общий javabean компаратор:

public class BeanComparator implements Comparator<Object> {

    private String getter;

    public BeanComparator(String field) {
        this.getter = "get" + field.substring(0, 1).toUpperCase() + field.substring(1);
    }

    public int compare(Object o1, Object o2) {
        try {
            if (o1 != null && o2 != null) {
                o1 = o1.getClass().getMethod(getter, new Class[0]).invoke(o1, new Object[0]);
                o2 = o2.getClass().getMethod(getter, new Class[0]).invoke(o2, new Object[0]);
            }
        } catch (Exception e) {
            // If this exception occurs, then it is usually a fault of the developer.
            throw new RuntimeException("Cannot compare " + o1 + " with " + o2 + " on " + getter, e);
        }

        return (o1 == null) ? -1 : ((o2 == null) ? 1 : ((Comparable<Object>) o1).compareTo(o2));
    }

}

, который вы можете использовать следующим образом:

// Sort on "phone" field of the Contact bean.
Collections.sort(contacts, new BeanComparator("phone"));

(как вы видите в коде, возможно, нулевые поля уже покрыты, чтобы избежать NPE во время сортировки)

252
ответ дан BalusC 16 August 2018 в 12:09
поделиться
  • 1
    Я бы добавил возможность предварительного определения нескольких компараторов, а затем используя их по имени ... – Stobor 29 November 2009 в 00:39
  • 2
    Фактически, я только что сделал. Легче, чем пытаться объяснить себя. – Stobor 29 November 2009 в 00:55
  • 3
    @Stobor: Ницца, спасибо. – BalusC 29 November 2009 в 00:56
  • 4
    Эти определения компаратора должны, вероятно, также быть static и, возможно, final тоже ... Или что-то вроде этого .. – Stobor 29 November 2009 в 01:04
  • 5
    Отличные примеры, спасибо! – Patrick 15 February 2010 в 15:00

Эта страница сообщает вам все, что вам нужно знать о сортировке коллекций, таких как ArrayList.

В основном вам нужно

  • сделать свой Contact реализует интерфейс Comparable, создавая в нем метод public int compareTo(Contact anotherContact).
  • Как только вы сделаете это, вы можете просто вызвать Collections.sort(myContactList);, где myContactList - ArrayList<Contact> (или любой другой набор из Contact).

Также существует и другой способ создания класса компаратора, и вы также можете прочитать об этом со связанной страницы.

Пример:

public class Contact implements Comparable<Contact> {

    ....

    //return -1 for less than, 0 for equals, and 1 for more than
    public compareTo(Contact anotherContact) {
        int result = 0;
        result = getName().compareTo(anotherContact.getName());
        if (result != 0)
        {
            return result;
        }
        result = getNunmber().compareTo(anotherContact.getNumber());
        if (result != 0)
        {
            return result;
        }
        ...
    }
}
8
ответ дан bguiz 16 August 2018 в 12:09
поделиться

BalusC и bguiz уже дали очень полные ответы о том, как использовать встроенные компараторы Java.

Я просто хочу добавить, что в сборках google есть класс Ordering , который является более «мощным», чем стандартные компараторы. Возможно, стоит проверить. Вы можете делать классные вещи, такие как составление заказов, их изменение, упорядочение в зависимости от результата функции для ваших объектов ...

Здесь - это сообщение в блоге, в котором упоминаются некоторые из его преимуществ .

5
ответ дан Etienne Neveu 16 August 2018 в 12:09
поделиться
  • 1
    Обратите внимание, что google-коллекции теперь являются частью Guava (общих java-библиотек Google), поэтому вы можете захотеть зависеть от Guava (или модуля коллекции Guava), если вы хотите использовать класс Ordering. – Etienne Neveu 30 April 2010 в 11:17

Функция Collections.sort является хорошей сортировкой. Если у вас нет сопоставимого значения для Contact, вам нужно будет выполнить реализацию Comparator

. Примечание:

Сортировка Алгоритм является модифицированным объединением (в котором слияние опущено, если наивысший элемент в нижнем подсписке меньше наименьшего элемента в высоком подсписке). Этот алгоритм обеспечивает гарантированную производительность n log (n). Указанный список должен быть модифицируемым, но его нельзя изменять. Эта реализация выгружает указанный список в массив, сортирует массив и выполняет итерацию по списку, сбросив каждый элемент из соответствующей позиции в массиве. Это позволяет избежать производительности n2 log (n), которая возникла бы при попытке сортировать связанный список на месте.

Сорт слияния, вероятно, лучше, чем большинство алгоритмов поиска, которые вы можете сделать.

0
ответ дан Joshua 16 August 2018 в 12:09
поделиться

Вам нужно, чтобы ваши классы контактов реализовали Comparable , а затем реализовали метод compareTo(Contact). Таким образом, Collections.sort сможет сортировать их для вас. На странице, с которой я связан, compareTo 'возвращает отрицательное целое число, ноль или положительное целое число, так как этот объект меньше, равен или больше указанного объекта.'

Например, если вы хотел сортировать по имени (от А до Я), ваш класс будет выглядеть так:

public class Contact implements Comparable<Contact> {

    private String name;

    // all the other attributes and methods

    public compareTo(Contact other) {
        return this.name.compareTo(other.name);
    }
}
4
ответ дан Kaleb Brasee 16 August 2018 в 12:09
поделиться
  • 1
    Хорошо со мной, спасибо! Я также использовал compareToIgnoreCase, чтобы игнорировать регистр. – Rani Kheir 10 April 2016 в 06:07

Используя lambdaj , вы можете сортировать коллекцию своих контактов (например, по их имени), как следует

sort(contacts, on(Contact.class).getName());

или по их адресу:

sort(contacts, on(Contacts.class).getAddress());

и т. д. Более того, он предлагает DSL для доступа и управления вашими коллекциями различными способами, такими как фильтрация или группировка ваших контактов на основе некоторых условий, объединение некоторых из их значений свойств и т. Д.

3
ответ дан Mario Fusco 16 August 2018 в 12:09
поделиться

Вы должны использовать функцию Arrays.sort. Содержащие классы должны реализовывать Comparable.

-1
ответ дан monksy 16 August 2018 в 12:09
поделиться

В дополнение к тому, что уже было опубликовано, вы должны знать, что со времени Java 8 мы можем сократить наш код и записать его так:

Collection.sort(yourList, Comparator.comparing(YourClass::getFieldToSortOn));

или поскольку у List теперь есть метод sort

yourList.sort(Comparator.comparing(YourClass::getFieldToSortOn));

Объяснение:

Начиная с Java 8, функциональные интерфейсы (интерфейсы только с одним абстрактным методом - они могут иметь больше стандартных или статических методов) могут быть легко реализованы с использованием:

  • lambdas arguments -> body
  • Ссылки на
  • или source::method.

Поскольку Comparator<T> имеет только один абстрактный метод int compare(T o1, T o2), это функциональный интерфейс.

Итак, вместо (пример из @BalusC answer )

Collections.sort(contacts, new Comparator<Contact>() {
    public int compare(Contact one, Contact other) {
        return one.getAddress().compareTo(other.getAddress());
    }
}); 

мы можем уменьшить этот код до:

Collections.sort(contacts, (Contact one, Contact other) -> {
     return one.getAddress().compareTo(other.getAddress());
});

Мы можем упростить эту (или любую) лямбда, пропустив типы аргументов

  • (Java будет их выводить основанный на сигнатуре метода)
  • или {return ... }

Итак, вместо

(Contact one, Contact other) -> {
     return one.getAddress().compareTo(other.getAddress();
}

мы можем написать

(one, other) -> one.getAddress().compareTo(other.getAddress())

Также теперь Comparator имеет статические методы, такие как comparing(FunctionToComparableValue) или comparing(FunctionToValue, ValueComparator), которые мы могли бы легко использовать для создания atat Comparators, которые должны сравнивать некоторые конкретные значения от объектов.

Другими словами, мы можем переписать выше код как

Collections.sort(contacts, Comparator.comparing(Contact::getAddress)); 
//assuming that Address implements Comparable (provides default order).
19
ответ дан Pshemo 16 August 2018 в 12:09
поделиться

Я сделал это следующим образом. номер и имя - два arraylist. Мне нужно сортировать имя. Если любое изменение произойдет, чтобы называть порядок arralist, число arraylist также изменит его порядок.

public void sortval(){

        String tempname="",tempnum="";

         if (name.size()>1) // check if the number of orders is larger than 1
            {
                for (int x=0; x<name.size(); x++) // bubble sort outer loop
                {
                    for (int i=0; i < name.size()-x-1; i++) {
                        if (name.get(i).compareTo(name.get(i+1)) > 0)
                        {

                            tempname = name.get(i);

                            tempnum=number.get(i);


                           name.set(i,name.get(i+1) );
                           name.set(i+1, tempname);

                            number.set(i,number.get(i+1) );
                            number.set(i+1, tempnum);


                        }
                    }
                }
            }



}
0
ответ дан sarath 16 August 2018 в 12:09
поделиться
  • 1
    Вы займете больше времени, чтобы написать это, получить менее оптимальную производительность сортировки, написать больше ошибок (и, надеюсь, больше тестов), а код будет сложнее передать другим людям. Так что это неправильно. Он может работать, но это не делает его правильным. – Eric 28 August 2014 в 02:49
Другие вопросы по тегам:

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