Как сделать размер шрифта Label таким же большим, как он может, и также иметь возможность изменять размер самого себя? JavaFX [дубликат]

В чем разница между sorted(list) vs list.sort()?

blockquote>
  • list.sort изменяет список на месте & amp; return None
  • sorted принимает любой итеративный & amp; возвращает новый список, отсортированный.

sorted эквивалентен этой реализации Python, но встроенная функция CPython должна работать заметно быстрее, поскольку она написана на C:

def sorted(iterable, key=None):
    new_list = list(iterable)    # make a new list
    new_list.sort(key=key)       # sort it
    return new_list              # return it

, когда использовать какой?

blockquote>
  • Используйте list.sort, если вы не хотите сохранять исходный порядок сортировки (таким образом, вы сможете повторно использовать список на месте в памяти.), и когда вы являетесь единственным владельцем списка (если список используется другим кодом и вы его мутируете, вы можете ввести ошибки, в которых используется этот список.)
  • Используйте sorted, если вы хотите сохранить исходный порядок сортировки или когда вы хотите создать новый список, которому принадлежит только ваш локальный код.

Можно восстановить исходные позиции списка после list.sort ()?

blockquote>

Нет - если вы сами не сделали копию, эта информация теряется, потому что сортировка выполняется на месте.

«И что быстрее? И сколько быстрее?»

blockquote>

Чтобы проиллюстрировать pena lty создания нового списка, используйте модуль timeit, вот наша настройка:

import timeit
setup = """
import random
lists = [list(range(10000)) for _ in range(1000)]  # list of lists
for l in lists:
    random.shuffle(l) # shuffle each list
shuffled_iter = iter(lists) # wrap as iterator so next() yields one at a time
"""

И вот наши результаты для списка случайно упорядоченных 10000 целых чисел, как мы видим здесь, мы опровергли более ранний микс о создании списка :

Python 2.7

>>> timeit.repeat("next(shuffled_iter).sort()", setup=setup, number = 1000)
[3.75168503401801, 3.7473005310166627, 3.753129180986434]
>>> timeit.repeat("sorted(next(shuffled_iter))", setup=setup, number = 1000)
[3.702025591977872, 3.709248117986135, 3.71071034099441]

Python 3

>>> timeit.repeat("next(shuffled_iter).sort()", setup=setup, number = 1000)
[2.797430992126465, 2.796825885772705, 2.7744789123535156]
>>> timeit.repeat("sorted(next(shuffled_iter))", setup=setup, number = 1000)
[2.675589084625244, 2.8019039630889893, 2.849375009536743]

После некоторой обратной связи , Я решил, что еще один тест будет желателен с разными характеристиками. Здесь я предоставляю тот же случайный упорядоченный список из 100 000 в длину для каждой итерации 1000 раз.

import timeit
setup = """
import random
random.seed(0)
lst = list(range(100000))
random.shuffle(lst)
"""

Я интерпретирую эту большую разницу в размере, полученной от копирования, упомянутого Martijn, но он не доминирует в точке в более старом более популярном ответе здесь, здесь увеличение времени составляет лишь около 10%

>>> timeit.repeat("lst[:].sort()", setup=setup, number = 10000)
[572.919036605, 573.1384446719999, 568.5923951]
>>> timeit.repeat("sorted(lst[:])", setup=setup, number = 10000)
[647.0584738299999, 653.4040515829997, 657.9457361929999]

. Я также использовал вышеописанное гораздо меньшую сортировку и увидел, что новая версия sorted все еще занимает около 2% более продолжительного времени работы на определенной длине 1000.

Poke также запускал свой собственный код, вот код:

setup = '''
import random
random.seed(12122353453462456)
lst = list(range({length}))
random.shuffle(lst)
lists = [lst[:] for _ in range({repeats})]
it = iter(lists)
'''
t1 = 'l = next(it); l.sort()'
t2 = 'l = next(it); sorted(l)'
length = 10 ** 7
repeats = 10 ** 2
print(length, repeats)
for t in t1, t2:
    print(t)
    print(timeit(t, setup=setup.format(length=length, repeats=repeats), number=repeats))

Он нашел для сортировки по длине 1000000 , (побежал 100 раз), аналогичный результат, но только примерно на 5% увеличение времени, вот результат:

10000000 100
l = next(it); l.sort()
610.5015971539542
l = next(it); sorted(l)
646.7786222379655

Заключение:

Сортировка большого размера с помощью sorted создание копии, вероятно, будет доминировать над различиями, но сама сортировка доминирует над операцией, и организация кода вокруг этих различий будет преждевременной оптимизацией. Я бы использовал sorted, когда мне нужен новый отсортированный список данных, и я бы использовал list.sort, когда мне нужно было отсортировать список на месте, и пусть это определит мое использование.

4
задан Sergey Grinev 18 December 2015 в 19:01
поделиться

2 ответа

Вы можете достичь этого, добавив -fx-padding: -10 0 0 0; в список ваших стилей.

Для более гибкого решения вы можете использовать информацию FontMetrics:

FontMetrics metrics = Toolkit.getToolkit().getFontLoader().getFontMetrics(label.getFont());
label.setPadding(new Insets(-metrics.getDescent(), 0, 0, 0));

Примечание: Вы должны вызвать этот код после scene.show(). До этого графический движок не готов предоставить правильные показатели.

3
ответ дан Sergey Grinev 24 August 2018 в 20:50
поделиться

Один из наиболее динамичных способов сделать это - использовать Text вместо метки и установить boundsType как VISUAL. Это приводит к тексту без каких-либо отступов на любой из сторон текста, независимо от размера шрифта.

Text text = new Text();
text.setBoundsType(TextBoundsType.VISUAL);
5
ответ дан ItachiUchiha 24 August 2018 в 20:50
поделиться
Другие вопросы по тегам:

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