|
|
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
Добрый день, коллеги! Вот такой вот пятничный говнокодец. Очень часто нужно сортировать сущности в коллекциях по разным колонкам. В настоящий момент это уродство выглядит вот так. Entity.java Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. SortProcessor Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. Обычно List<entity> связана 1:1 с GWT FlexTable и отображается на UI пользователя как есть. Сортировать на стороне источника данных не всегда возможно. Где БД - мы как-то сортируем а вот из rest-сервисов приходится делать всё самим. Встроенные DBMS (Derby, HyperSonic, H2) мы не используем. Сами entities лежат в скоупе GWT компилляции и имеют поля только основных примитивных типов (int, String, Date, BigDecimal). Сложные объекты я пока не встречал. Вопрос: Как сортировать универсально? Нужен какой-то компонент (SpringBean) которому на вход приходит неизвестная коллекция List<Object> и номер колонки и direction (ASC|DESC) по которой надо сортировать и на выходе мы имеет отсортированное. Буду рад выслушать идеи, Best Practices и почитать исходники. Спасибо! P.S. Реверс тоже радует :) P.P.S Фух. Написал таки. Пятница ... мать ее так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 20:48 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
А reflection не спасет отца русской демократии? Если нужна производительность, то что-то типа CGLIB AFAIK & IMHO. Я бы в этом направлении делал, но осторожно, думая о производительности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 20:56 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
Codegeneration меня точно спасёт. Не утонуть-бы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 21:11 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
http://tips4java.wordpress.com/2008/10/23/bean-comparator/ говнокод, говнокодом, но тут ещё какой-то тупак с индексом поля. Кто придумал свойства через int адресовать? В остальном, всё достаточно примитивно. Надо тупо избавиться от копипаста и станет более менне адекватно. Попробую изобразить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 21:32 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 21:53 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, блин, прогнал немного. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 21:58 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
switch..case можно смело в саму entity унести ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 22:42 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
О. Спасибо попробую. С entities такой трабл что компилируются они плагином gwt-maven-plugin а с этим есть различные language limitations. Не всё что есть в Java компилируется в GWT. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 23:25 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
Blazkowicz Код: java 1. Рекомендую посмотреть Commons BeanUtils, там уже всё сделали (а именно BeanComparator) http://commons.apache.org/proper/commons-beanutils/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2014, 22:00 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
mayton , Если интересно сделать именно самому, то я бы смотрел банально в сторону рефлекшена и Unsafe: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. Ну и прочих фишек и оптимизаций уже сами нафигачите. Например, проверять SortType можно один раз на весь процесс сортировки, а не на каждом сравнении, как у меня. Можно передавать опциональный Comparator. И т.д.. Но вообще, как сказали выше, такое наверняка уже давным давно есть в каких-нибудь утилитарных библиотеках. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2014, 22:41 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
Плюс можно, например, не создавать новый компаратор на каждый раз, а статически их создать и закэшировать. Например, по каждому типу и "направлению сортировки". Таким образом, у вас их будет штук эдак 18 (9 типов * 2 направления), зато GC Будет за вами меньше мусора собирать. Ну это уже совсем изврат, если прям все соки надо выжать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2014, 22:50 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
Шняга какая-то, зачем рефлекшн. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.02.2014, 23:10 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
cdtyjvПлюс можно, например, не создавать новый компаратор на каждый раз, а статически их создать и закэшировать. Например, по каждому типу и "направлению сортировки". Таким образом, у вас их будет штук эдак 18 (9 типов * 2 направления), зато GC Будет за вами меньше мусора собирать. Ну это уже совсем изврат, если прям все соки надо выжать Это тема. +1 Я думаю что нам нужен пул компараторов. У нас в коде штук 200 интерфейсов и на каждый есть 1 FlexTable c 5-10 колонками сортировок. Тоесть грубо говоря нам надо 200 * 5 = 1000 компараторов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2014, 00:20 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
ivanraРекомендую посмотреть Commons BeanUtils, там уже всё сделали (а именно BeanComparator) http://commons.apache.org/proper/commons-beanutils/ Мне не нужно ничего рекомендовать, я вопросов не задавал. BeanComparator работает на рефлексии. Мой код - нет. Я просто отрефакторил то что привел mayton ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2014, 10:38 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
maytonЭто тема. +1 Я думаю что нам нужен пул компараторов. У нас в коде штук 200 интерфейсов и на каждый есть 1 FlexTable c 5-10 колонками сортировок. Тоесть грубо говоря нам надо 200 * 5 = 1000 компараторов. Сортировка клиентская или серверная? В любом случае зачем пул, если на сервере компаратор быстро издохнет в молодом поколении, а на клиенте никто не будет так часто и постоянно сортировать все возможные интерфейсы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2014, 10:42 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
Лагман, А зачем столько новых бестолковых Comparator для типов, которы уже реализуют Comparable? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2014, 10:43 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
Лагман, y нас есть необходимость сортировать также null значения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2014, 11:29 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
mayton, А так ли нужен вам List<FuckenEntity> ? Не подойдет ли List<List<Comparable>>, т.е. матрица свойств обектов, вместо списка обектов. Ну и можно класс отдельный создать Matrix<T extends Comparable>, который будет еще и описания колонок внутри себя хранить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2014, 12:42 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
HoBTIDMatrix<T extends Comparable> Не так, правильнее Matrix<? extends Comparable> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2014, 12:44 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
BlazkowiczBeanComparator работает на рефлексии. Мой код - нет. Я просто отрефакторил то что привел mayton Все так, но доступ к геттерам в BeanComparator кешируется, так что расходы на рефлексию (в большой коллекции, либо при многократной сорировке) сводятся к вызову этих геттеров, что сравнимо по производительности с работой через интерфейсы. Поэтому BeanComparator не такой уж и медленный, как кажется на первый взгляд. Конечно, хардкод будет самый быстрый, но можно ли это считать Best practices? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2014, 13:08 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
MonochromatiqueВ каком кошмаре живут явисты. https://code.google.com/p/lambdaj/ Иди из нашего кошмара в свой- установки MS серверов и совместимости версия дотнета :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2014, 15:25 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
Alexey TominMonochromatiqueВ каком кошмаре живут явисты. https://code.google.com/p/lambdaj/ Иди из нашего кошмара в свой- установки MS серверов и совместимости версия дотнета :) Да как бы нет проблем. )) Но как-то хотелось думать (не приведи Бог столкнуться), что в JAVA есть эквивалент - persons.OrderBy(p=>p.name) На что я кстати и привел ссылку. Просто ты наверное не понял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2014, 15:31 |
|
||
|
Пятничный Best practices.
|
|||
|---|---|---|---|
|
#18+
MonochromatiqueAlexey Tominпропущено... Иди из нашего кошмара в свой- установки MS серверов и совместимости версия дотнета :) Да как бы нет проблем. )) Но как-то хотелось думать (не приведи Бог столкнуться), что в JAVA есть эквивалент - persons.OrderBy(p=>p.name) Будет в JDK8 MonochromatiqueНа что я кстати и привел ссылку. Просто ты наверное не понял. Я не понял, что ты этим хотел сказать, да :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2014, 17:41 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38555003&tid=2122562]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
141ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
| others: | 201ms |
| total: | 444ms |

| 0 / 0 |
