|
|
|
Рефакторинг
|
|||
|---|---|---|---|
|
#18+
Не знаю каким еще умным словечком обозвать тему. Ваша задача: Увидели ошибку - ткнули меня лицом в грязь. (написал код, но надо его привести к нормальному виду) Дано: Xls файл, 0 столбец(список - далее Б) и начиная с 2 по 11 столбцы(Список списков(С) - далее А). Количество строк пока ограничено 30. Цель: найти совпадение для каждого элемента из каждой строки А (список(С)) в векторе Б. Алгоритм: Сначала сортировка сортировка А с помощью Collections.sort(List,Comparator). Comparator сравнивает длину списков. сортировка Б - сортировка, используя ассоциативный массив, который хранит количество одинаковых элементов сортировка С -с помощью Collection.sort Поиск для каждого элемента из каждой строки А (список(С)) совпадения в векторе Б. Код: Код по абсолютной величине не большой) Наверно основным минусом является то, что я совсем не использую принципы ООП к этой задаче. Start(main) Код: 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. CompareAndWrite Код: 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. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. ReadXls Код: 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. ReadXls1Column Код: 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. The result: http://imageshack.us/photo/my-images/819/mp51.png/ http://imageshack.us/photo/my-images/841/z5c3.png/ По мимо того, что вам не понравиться, беспокоят следующий вещи: 1. Я прохожу по тройному циклу ради поиска элементов. Может легче перегнать каждый список в отдельное Множество? Но тогда будут проблемы с доступом к элементам(редактирование, удаление, добавление по позиции) 2. Сортировки используются Collection.sort, т.е. quicksort . А вот когда прохожу по тройному циклу сложность будет O(N*M*K) ? Сильно отразится такой перебор на производительности? 3. В процессе написания вопроса осознал, что зачем-то реализовал два класса для чтения, хотя казалось, что одним не обойтись ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2013, 11:07:18 |
|
||
|
Рефакторинг
|
|||
|---|---|---|---|
|
#18+
я не прошу проверять каждую строчку, просто посмотреть на логику и сказать, как можно было сделать иначе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2013, 11:09:23 |
|
||
|
Рефакторинг
|
|||
|---|---|---|---|
|
#18+
eldarkaa, Содержимое ячеек всегда числовые? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2013, 12:15:34 |
|
||
|
Рефакторинг
|
|||
|---|---|---|---|
|
#18+
пока да , читаю как String, потому что в apache-poi какой-то геморрой с типом getNumericCellValue(), по задумке авторов возвращает тип Double, но и со страшной силой ругается если значение null, в отличие от getStringCellValue(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2013, 12:25:42 |
|
||
|
Рефакторинг
|
|||
|---|---|---|---|
|
#18+
offtopкак меня убивает, что нельзя сообщение отредактировать потом идет Integer.parseInt(значения строки), все равно надо было бы преобразовывать Double => Integer ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2013, 12:27:20 |
|
||
|
Рефакторинг
|
|||
|---|---|---|---|
|
#18+
Для начала стоило причесать код согласно распространенным coding convention. Пробелы, скобки и много другое, сильно упрощают чтение кода. Причем все современные IDE умеют это делать за вас в одно-два нажатия кнопок. А так это банальное проявление не уважения к участникам форума. CompareAndWrite.main("Text1Export",listRZS,listASU) - неоправданое использование статического метода. Чисто процедурное программирование. Код: java 1. 2. 3. 4. 5. 6. Взрыв мозга. Почему синглтон? Почему через enum? Почему List без Generic. Почему ниже создаётся анонимный компаратор, а тут такой финт ушами? Код: java 1. 2. 3. 4. 5. Логичнее было бы так Код: java 1. 2. 3. 4. 5. Ну, и я бы автобоксингом так шибко не увлекался. CompareAndWrite - тихий ужас целиком и полностью. Ни о чем не говорящие имена List, ListOfList, style, style2, style3 Магические числа 30, 20, 12, 15, 13, 14, 16, 2... Почему не 25, 17, 3, 2, 1, 11, 8...? Или 22, 18, 39, 50, 100, 1...? "founded" - find - искать. found - найден. founded - основан, установлен. Сплошной копипаст циклов. Если вынести общий код в методы, класс можно раза в два уменьшить. Не используется finally, что приведет к залоченым файлам. Код: java 1. 2. 3. Runtime исключение это косяки программиста, поэтому их не нужно ловить, их нужно исправлять. Код: java 1. 2. Это зачем вообще? Просто захотелось попробовать? Если тело условия пишется в той же строке что и условие, то скобки, обычно не ставят. Но если тело переносится на следующую строку, то скобки нужны обязательно. В общем, тут и без рефакторинга ещё причесывать и причесывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2013, 12:50:22 |
|
||
|
Рефакторинг
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, +1 Мне лично стало лень читать исходники когда увидел как они отформатированы..) По поводу фигурных скобок только не всё однозначно.. NetBeans при форматировании кода их автоматически подставляет (и в общем я это поддерживаю). А каждый раз их удалять когда хочется сделать код компактней - думаю не очень хорошая идея.. P.S. Спойлеры - это хорошо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2013, 13:23:37 |
|
||
|
Рефакторинг
|
|||
|---|---|---|---|
|
#18+
Usman, аккуратней, так и до deadlock топиков не далеко ) Принял всё к сведению и, конечно, исправлю всё. Ошибок не делает тот, кто ничего не делает. Blazkowicz Взрыв мозга. Почему синглтон? Почему через enum? Почему List без Generic. :( Я не знаю. Компаратор с объектами я так и не въехал пока. Его мне посоветовали на переполненном стеке. (By the way, I've used an enum for the enum singleton pattern because our Comparator stores no state.) А то что в нем, невозможно объявить Гинерик, тоже нечего ответить. Я пытался добавить, но тогда Компаратор ругается. ------------------------- ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2013, 14:26:39 |
|
||
|
Рефакторинг
|
|||
|---|---|---|---|
|
#18+
eldarkaa:( Я не знаю. Компаратор с объектами я так и не въехал пока. Его мне посоветовали на переполненном стеке. А вот это Код: java 1. 2. 3. можно подумать компаратор без объектов? (By the way, I've used an enum for the enum singleton pattern because our Comparator stores no state.) Гениально. Давайте все классы, которые не имеют состояния, делать enum-синглтонами. eldarkaaА то что в нем, невозможно объявить Гинерик, тоже нечего ответить. Я пытался добавить, но тогда Компаратор ругается. В текущей реализации компилятор должен выдавать предупреждения. Должно быть хотя бы так Код: java 1. 2. Могу и ошибаться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2013, 14:37:49 |
|
||
|
Рефакторинг
|
|||
|---|---|---|---|
|
#18+
eldarkaaUsman, аккуратней, так и до deadlock топиков не далеко )eldarkaa Дано: Xls файл...Можете приаттачить свой XLS-файл? (пусть даже тестовый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2013, 14:52:52 |
|
||
|
Рефакторинг
|
|||
|---|---|---|---|
|
#18+
Usman, Скучно стало? На основе его создадите просто с другим названием (Text1Export.xls). Еще библиотеку apache-poi придется скачать, если вы правда хотите запустить. Может JAR кинуть в котором все? Только там я не знаю, как изменить абсолютную директорию, куда сохраняется файл) Blazkowicz, сейчас добавил в Компаратор Гинерик и сверху тоже, тогда стало возможным к переменным добавлять Гинерик. Так же как вы написали.. Blazkowiczimplements Comparator<List<?>> { public int compare(List<?> one, List<?> other) { Компаратор с объектами, я имел ввиду сложные объекты (коллекции). Он не такой простой как переопределенный родительский. Потребовался сингтон шаблон еще, а для меня это темный лес, вот к чему я. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2013, 15:02:01 |
|
||
|
Рефакторинг
|
|||
|---|---|---|---|
|
#18+
синглтон * (singleton) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2013, 15:03:05 |
|
||
|
Рефакторинг
|
|||
|---|---|---|---|
|
#18+
eldarkaa, String это такой же объект как и List. Компаратор для String реализован по старинк через анонимный класс. А вот совершенно анологичный компаратор для List почему-то вдруг стал enum синглтоном. Это читаемости коду не добавляет. А только добавляет удивления. Я бы убрал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2013, 15:42:31 |
|
||
|
Рефакторинг
|
|||
|---|---|---|---|
|
#18+
eldarkaaКоличество строк пока ограничено 30.Максимально сколько может быть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2013, 15:46:46 |
|
||
|
Рефакторинг
|
|||
|---|---|---|---|
|
#18+
около двух тысяч +- "тыща" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2013, 15:48:20 |
|
||
|
Рефакторинг
|
|||
|---|---|---|---|
|
#18+
eldarkaa, какие тебе еще идеи? Ты объединение циклов сделай. В глазах ведь рябит. Потом версию выкладывай. Будем дальше смотреть. Рефакторинги появляются последовательно. Одно сделал - следом появляется другое. За деревьями не видно леса (с). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2013, 16:33:57 |
|
||
|
Рефакторинг
|
|||
|---|---|---|---|
|
#18+
eldarkaa, У каждого "однотипного" изделия (элемента) может быть уникальное поле (типа ID/серийник)? Как вы заполняете столбец P? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2013, 17:14:29 |
|
||
|
Рефакторинг
|
|||
|---|---|---|---|
|
#18+
1 строчка(со 2-го по 11-ый столбец) это Компонент, у него может быть 10 изделий (замен) (они же 10 колонок) Может ли быть у Компонента ID? - В данной реализации нет. Столбец Р . Возможная замена(изделие). Значит, если нашлась замена(изделие), которое содержится в РЗС(2-11 столбцы) и в АСУ(1 столбец), то она отмечается как Используемая. Все другие, которые можно использовать помечаются Возможными. Есть ли приоритет? Приоритет только по количеству замен(изделий) в АСУ, поэтому АСУ отсортирован по количеству. Много изделий - уходят первыми и так далее. Сначала ищутся по РЗС(2-11столбцы), в которых мало замен, потом по нарастающей. Пока в АСУ возможные блокируют места, но на самом деле они только возможные. Это можно сделать если убрать # удаление из списка элементов и последующего добавления "another" # Код: java 1. и подкраску цветом тоже ----- Оффтоп. Пока так не надо делать. По хорошему счету надо создавать Сущность для таблица РЗС (с 2 по 11 колонку). Если ее создавать то появится айди, но появятся сложности с вытаскиванием и модифицированием значений, а так же обрежутся вкусные функции от Коллекции. Возможно тут на помощь должен прийти ООП с его наследованием, но я еще дуб) + это пока не востребовано. ------------------------------------ Вечерком переделаю и сделаю новый топик или этот апну. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2013, 18:10:46 |
|
||
|
Рефакторинг
|
|||
|---|---|---|---|
|
#18+
Переделал чтение из файла, чтобы можно было зачитать все за 1 раз) и тут я вспомнил, почему мне потребовалось 2класса) Ведь получать из метода можно только 1 параметр) Ну вот теперь искать информацию по получению нескольких параметров из метода. Что-то пока не получается... Добавил новый класс, для хранения. Но опять те же грабли, что и были раньше. Blackwitz уже помогал мне с логикой хранения, когда создавали класс запись и ее хранили в классе хранилище. ----------------------- Start Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ReaderXls Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. DataFromReader Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Данные не передаются из ReadXls в Start. (Скорее передаются, но затираются новым экземпляром класса(DataFromReader) в Start. Какой-то косяк в том, что объекты статические или нет. До CompareAndWrite еще не дошел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2013, 12:37:46 |
|
||
|
Рефакторинг
|
|||
|---|---|---|---|
|
#18+
eldarkaa, Ведь получать из метода можно только 1 параметр) Ну вот теперь искать информацию по получению нескольких параметров из метода. Этот один возвращаемый результат может быть чем угодно, в том числе коллекцией. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2013, 12:57:01 |
|
||
|
Рефакторинг
|
|||
|---|---|---|---|
|
#18+
eldarkaaнескольких параметров из методаМожно еще перегрузить метод ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2013, 13:10:21 |
|
||
|
Рефакторинг
|
|||
|---|---|---|---|
|
#18+
UsmanМожно еще перегрузить метод Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. P.S. Почему не на VBA ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2013, 13:15:21 |
|
||
|
Рефакторинг
|
|||
|---|---|---|---|
|
#18+
Потому что Java! Excel выступает в роли GUI) Думаю перепилить на SWING, но пока не хватает смелости и знаний. Версия 2.0.x.d Гоу рефакторинг?) Код стал поменьше, но думаю переборщил с переопределением writer в CompareAndWrite. Почему в CompareAndWrite опять непонятные числа ? 0-2-15? Это все входные данные, которые указывали бы с какого столбца начинать. По-прежнему присутствует магия чисел из-за отсутствия нормальных входных данных. Start(main) Код: 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. ReadXls Код: 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. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. CompareAndWrite Код: 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. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. SizeComparatorpackage workhere; import java.util.Comparator; import java.util.List; public class SizeComparator implements Comparator<List<String>> { public int compare(List <String> one, List<String> other) { return one.size() - other.size(); } } * В ReadXls много исключений из-за FileInputStream, HSSFWorkBook и из-за него - cell.setCellType(Cell.CELL_TYPE_STRING); Это не правильно выводить исключения на экран и никак не реагировать, но FileInputStream точно выдавать будет исключение, если файла не будет, а другие двое - странные совсем.. Беспокоят следующий вещи: 1. Я прохожу по тройному циклу ради поиска элементов. Может легче перегнать каждый список в отдельное Множество? Но тогда будут проблемы с доступом к элементам(редактирование, удаление, добавление по позиции) 2. Сортировки используются Collection.sort, т.е. quicksort . А вот когда прохожу по тройному циклу сложность будет O(N*M*K) ? Сильно отразится такой перебор на производительности? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2013, 17:36:47 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38367720&tid=2128794]: |
0ms |
get settings: |
12ms |
get forum list: |
28ms |
check forum access: |
9ms |
check topic access: |
9ms |
track hit: |
72ms |
get topic data: |
22ms |
get forum data: |
6ms |
get page messages: |
122ms |
get tp. blocked users: |
3ms |
| others: | 293ms |
| total: | 576ms |

| 0 / 0 |
