Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: Общие вопросы > Поиск по Vector пользовательского типа |
Автор: triclosan 10.10.2006, 11:21 | ||
Храню данные в контейнере типа Vector. Каждый элемент - объект класса:
Не пойму, как искать элемент, например, по заданному значению idnumber? Можно ли здесь использовать метод indexOf? |
Автор: LSD 10.10.2006, 11:37 |
В коллекциях для поиска элементов используется метод equals(). Если надо делать сложный поиск объекта, используй TreeSet и свой Comparator. И почитай http://vingrad.ru/JAVA-ART-003066 статью, и статьи по ссылкам. |
Автор: triclosan 10.10.2006, 11:55 |
спасибо за ответы, буду пробовать. |
Автор: NotGonnaGetUs 10.10.2006, 12:57 |
От туда: "Коллекции часто рассматривают объекты как одинаковые, если у них одинаковый хэшкод." Лучше это исправить, если есть возможность. |
Автор: triclosan 10.10.2006, 17:56 | ||
Элементов не так уж много поэтому решил использовать перебор в лоб. Метод удаляет выбранный элемент вектора поиск производится по параметру idnumber, но при выполнении выдает ConcurrentModificationException.
Это метод класса, используемого как JavaBean в JSP, вот такие ошибки сообщает: type Exception report message description The server encountered an internal error () that prevented it from fulfilling this request. exception org.apache.jasper.JasperException org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:245) javax.servlet.http.HttpServlet.service(HttpServlet.java:802) root cause java.util.ConcurrentModificationException java.util.AbstractList$Itr.checkForComodification(Unknown Source) java.util.AbstractList$Itr.next(Unknown Source) net.enamine.shop.UserData.deleteSubstance(UserData.java:84) org.apache.jsp.my.vieworder_jsp._jspService(org.apache.jsp.my.vieworder_jsp:115) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:99) javax.servlet.http.HttpServlet.service(HttpServlet.java:802) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:325) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:295) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:245) javax.servlet.http.HttpServlet.service(HttpServlet.java:802) note The full stack trace of the root cause is available in the Apache Tomcat/5.5.7 logs. В документации Sun это объясняется некими fail-fast итераторами только не пойму как с ними бороться. |
Автор: batigoal 10.10.2006, 19:13 |
Видимо, дело в том, что ты одновременно читаешь вектор (через итератор), и пытаешься его внутри этого итератора перезаписать. |
Автор: triclosan 10.10.2006, 20:24 |
Да, перенос удаления после цикла с итератором спасло отца русской демократии ![]() |
Автор: LSD 10.10.2006, 21:24 |
У Iterator-а есть метод remove(), для удаления текущего элемента. Вот им и надо удалять, тогда ошибок не будет. |
Автор: triclosan 10.10.2006, 21:32 | ||
Здорово, а то я лучше не придумал, чем дополнительную переменную ввести, матчасть хромает... |
Автор: triclosan 11.10.2006, 13:15 |
А как вызывать методы класса для объектов в коллекции? В С++ можно по индексу, а в JAVA как? |
Автор: batigoal 11.10.2006, 13:19 | ||||
Если коллекция поддерживает доступ по индексу, то можно и
|
Автор: Stampede 11.10.2006, 18:14 | ||||||
Не совсем верно. В таком виде, как тут написано, компилятор выдаст ошибку: необъявленная переменная temp. Кроме того, коль скоро я вижу тут generics, то речь идет об 1.5, а в нем для итерирования предусмотрен гораздо более компактный синтаксис:
И фсе! Весь итератор - в одну строку. |
Автор: batigoal 11.10.2006, 21:22 | ||
Это я кусок кода из примера товарища triclosan выдрал. |
Автор: Stampede 11.10.2006, 22:18 | ||||
А, вижу. Там переменная temp объявлена вне цикла. triclosan, по этому поводу у Блоха в "Effective Java" есть отдельный совет:
То есть по-хорошему этот кусок следовало бы переписать так (с учетом замечания LSD об удалении из итератора):
Коротко, наглядно и безопасно ![]() Да, а по поводу краткого синтиаксиса для итерирования - это я малость погорячился. Не учел, что нам нужно ссылаться на собственно итератор для удаления элемента. Вообще интересно, можно ли как-нибудь получить ссылку на неявный объект итератора? Почитал в спецификации языка - ничего про это нет. А ведь полезная была бы фича ![]() |
Автор: triclosan 12.10.2006, 00:34 | ||
Такую привычку, программируя на С приобрел. Разве в случае объявления внутри цикла переменная будет видна только там ![]() |
Автор: batigoal 12.10.2006, 08:11 | ||
Разумеется. Локальная переменная существует только внутри блока кода. |