Чтобы отсортировать строки в алфавитном порядке, вам нужно будет использовать Collator
, например:
LinkedList<String> list = new LinkedList<String>();
list.add("abc");
list.add("Bcd");
list.add("aAb");
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return Collator.getInstance().compare(o1, o2);
}
});
. Если вы просто вызываете Collections.sort(list)
, у вас будут проблемы со строками, содержащими прописные буквы.
Например, в коде, который я вставил, после сортировки список будет: [aAb, abc, Bcd]
, но если вы просто назовете Collections.sort(list);
, вы получите: [Bcd, aAb, abc]
Примечание : при использовании Collator
вы можете указать локаль Collator.getInstance(Locale.ENGLISH)
, это обычно довольно удобно.
Попробуйте hasattr()
:
if hasattr(a, 'property'):
a.property
РЕДАКТИРОВАНИЕ: См. ответ zweiterlinde ниже, кто дает хороший совет о выяснении у прощения! Очень pythonic подход!
общая практика в Python - то, что, если свойство, вероятно, будет там большую часть времени, просто назовите его и или позвольте исключению распространить или захватить его с блоком попытки/кроме. Это, вероятно, будет быстрее, чем hasattr
. Если свойство, вероятно, не будет там большую часть времени, или Вы не уверены, использование hasattr
, вероятно, будет быстрее, чем повторное попадение в блок исключения.
Я думаю, что Вы ищете, hasattr. Однако я рекомендовал бы что-то вроде этого, если Вы хотите обнаружить свойства -
Pythontry:
getattr(someObject, 'someProperty')
except AttributeError:
print "Doesn't exist"
else
print "Exists"
, недостаток здесь - то, что ошибки атрибута в свойствах __get__
код также фиксируются.
Иначе, сделайте -
if hasattr(someObject, 'someProp'):
#Access someProp/ set someProp
pass
Документы: http://docs.python.org/library/functions.html
Предупреждение:
причина моей рекомендации состоит в том, что hasattr не обнаруживает свойства.
Ссылка: http://mail.python.org/pipermail/python-dev/2005-December/058498.html
В зависимости от ситуации можно свериться isinstance
, какой объект Вы имеете и затем используете соответствующие атрибуты. С введением абстрактные базовые классы в Python 2.6/3.0 этот подход также стал намного более мощным (в основном, ABC допускают более сложный способ утиного ввода).
Одна ситуация была, это полезно, был бы то, если два различных объекта имеют атрибут с тем же именем, но с другим значением. Используя только hasattr
мог бы тогда привести к странным ошибкам.
Одним хорошим примером является различие между итераторами и iterables (см. этот вопрос). Эти __iter__
методы в итераторе и повторяемом имеют то же имя, но семантически очень отличаются! Так hasattr
бесполезно, но isinstance
вместе с ABC предоставляет чистое решение.
Однако я соглашаюсь, что в большинстве ситуаций hasattr
подход (описанный в других ответах) является наиболее подходящим решением.
Можно использовать hasattr()
или выгода AttributeError
, но если Вы действительно просто хотите значение атрибута со значением по умолчанию, если это не там, наилучший вариант состоит в том, чтобы только использовать getattr()
:
getattr(a, 'property', 'default value')
Как Jarret Hardie, которому отвечают, hasattr
, добьется цели. Я хотел бы добавить, тем не менее, что многие в сообществе Python рекомендуют стратегию "легче попросить прощение, чем разрешение" (EAFP), а не "смотрит перед прыганием" (LBYL). Посмотрите эти ссылки:
EAFP по сравнению с LBYL (было Ре: Немного разочарованный до сих пор)
EAFP по сравнению с LBYL @Code Как Pythonista: Идиоматический Python
т.е.:
try:
doStuff(a.property)
except AttributeError:
otherStuff()
... предпочтен:
if hasattr(a, 'property'):
doStuff(a.property)
else:
otherStuff()
Согласно pydoc, hasattr (obj, опора) просто называет getattr (obj, опора) и ловит исключения. Так, это столь же допустимо, чтобы обернуть доступ атрибута с оператором попытки и поймать AttributeError, как это должно использовать hasattr () заранее.
a = SomeClass()
try:
return a.fake_prop
except AttributeError:
return default_value
Другой возможный вариант, но это зависит если, под чем Вы подразумеваете прежде :
undefined = object()
class Widget:
def __init__(self):
self.bar = 1
def zoom(self):
print("zoom!")
a = Widget()
bar = getattr(a, "bar", undefined)
if bar is not undefined:
print("bar:%s" % (bar))
foo = getattr(a, "foo", undefined)
if foo is not undefined:
print("foo:%s" % (foo))
zoom = getattr(a, "zoom", undefined)
if zoom is not undefined:
zoom()
вывод:
bar:1
zoom!
Это позволяет Вам даже не проверять ни на Один - оцененные атрибуты.
, Но! Будьте очень осторожны, Вы случайно не инстанцируете и выдерживаете сравнение undefined
несколько мест, потому что эти is
никогда не будет работать в этом случае.