Как я могу отсортировать мой arraylist по имени & ldquo; serviceNeedingTasks & rdquo; основанный на двух атрибутах объекта [duplicate]

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

3
задан jklmnn 16 April 2015 в 14:43
поделиться

4 ответа

Было бы гораздо проще использовать пользовательские компараторы:

Сортировка по name:

Arrays.sort(carArray, Comparator.comparing(Car::name));

Сортировка по colour:

Arrays.sort(carArray, Comparator.comparing(Car::colour));

Итак, вы можете изменить getSortedArray():

public static Car[] getSortedArray(Car[] carArray, Comparator<Car> comparator) {
    Car[] sorted = carArray.clone()
    Arrays.sort(sorted, comparator);
    return sorted;
}

И называть его следующим образом:

Car[] sorted = getSortedArray(carArray, Comparator.comparing(Car::name));

Изменить:

Если вы используете языковая версия, которая не поддерживает эти функции, вы можете создавать компараторы, явно создавая вложенный класс, реализующий интерфейс Comparator.

Это, например, одноэлемент Comparator, который сравнивает Car экземплярами name:

static enum ByName implements Comparator<Car> {
    INSTANCE;

    @Override
    public int compare(Car c1, Car c2) {
        return c1.name().compareTo(c2.name());
    }
}

Затем вызывать:

Car[] sorted = getSortedArray(carArray, ByName.INSTANCE);
6
ответ дан Anderson Vieira 20 August 2018 в 11:58
поделиться
  • 1
    Похоже, что это решит мою проблему, но, похоже, для Android это не работает. Я применил Java 8 как JDK для AndroidStudio, но, похоже, не знает, что Comparator.comparing и Car :: name дают мне ошибку, что ссылки на методы не поддерживаются на этом языке. – jklmnn 16 April 2015 в 19:23
  • 2
    @jklmnn Я обновил ответ. Это должно работать на старых версиях Java. – Anderson Vieira 16 April 2015 в 19:46
  • 3
    Хорошо, это, похоже, проблема с Android, я создал небольшой тест с классом автомобиля, и это сработало. Благодаря! – jklmnn 16 April 2015 в 19:55
0
ответ дан Alex Pruss 20 August 2018 в 11:58
поделиться

TL; DR: для этого уже есть колесо.

Я бы сказал, что самый простой способ сделать это - создать компаратор:

final Comparator<Car> byName = Comparator.comparing(Car::name);
final Comparator<Car> byColour = Comparator.comparing(Car::colour);

Затем просто используйте соответствующий метод на Arrays для сортировки компаратором:

Arrays.sort(carArray, byName);

Теперь вы хотите сделать это с помощью enum? Просто используйте enum implements Comparator<Car>:

enum SortBy implements Comparator<Car> {
    NAME(Comparator.comparing(Car::name)),
    COLOUR(Comparator.comparing(Car::colour));

    private final Comparator<Car> delegate;

    private SortBy(Comparator<Car> delegate) {
        this.delegate = delegate;
    }

    @Override
    public int compare(final Car o1, final Car o2) {
        return delegate.compare(o1, o2);
    }               
}

Хотите отсортировать по name , а затем по colour? Easy:

final Comparator<Car> byName = SortBy.NAME.thenComparing(SortBy.COLOUR);

Хотите сортировать по имени в обратном порядке? Легко:

final Comparator<Car> byName = SortBy.NAME.reversed();
2
ответ дан Boris the Spider 20 August 2018 в 11:58
поделиться

Я думаю, что решение будет более эффективным, если вы передадите реализацию Comparator в Array.sort. Прямо сейчас, вы зацикливание п * 2 от взглядов его, хэш-карта (O (1)) плюс Arrays.sort (что является еще 0 (п § п) или, например). Если вы ниже, вы можете пропустить 2 петли, и карта, вы используете в настоящее время

Вы можете просто создать компаратор, как (грубый код):.

class CarComparator implements Comparator<Car> {
    enum compareType; //plus setter

    public int compareTo(Car a, Car b) {
        if(compareType == COLOUR) return a.colour.compareTo(b.colour);
        if(compareType == NAME.....
    }
}

, а затем просто отправить массив автомобилей в

Arrays.sort(cars, new CarComparator(COLOUR))

, или использовать более специализированные классы компараторов, по одному для каждого атрибута, и завод, чтобы сделать их, и, конечно, не создают новый Comparator () для каждого типа, если это происходит часто. : -)

В целом, этот подход должен сделать ваш код более эффективным. }

0
ответ дан Jonas 20 August 2018 в 11:58
поделиться
Другие вопросы по тегам:

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