Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:
null
. null
. null
, как если бы это был массив. null
, как если бы это был массив. null
как будто это было значение Throwable. Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null
.
Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html
Было бы гораздо проще использовать пользовательские компараторы:
Сортировка по 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);
Я бы сказал, что самый простой способ сделать это - создать компаратор:
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();
Я думаю, что решение будет более эффективным, если вы передадите реализацию 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 () для каждого типа, если это происходит часто. : -)
В целом, этот подход должен сделать ваш код более эффективным. }