按字母顺序获取对象的java集合
Posted
技术标签:
【中文标题】按字母顺序获取对象的java集合【英文标题】:Getting a java collection of objects in Alphabetical order 【发布时间】:2011-02-19 02:51:12 【问题描述】:我有一个问题,我真的不知道从哪里开始。所以我想我会在这里问。
基本上,我有一个下拉列表,其中包含名称。我希望这些名称按字母顺序排列。
填充下拉列表如下所示;
我查询一个数据库并拉下一个 ID 和名称,创建一个名为“UserList”的对象,并使用我返回的内容设置名称和 ID 变量。 然后我将此对象添加到 ArrayList。我一遍又一遍地这样做。
然后我将此集合转换为数组,并使用
将其传递给我的 JSP 页面session.setAttribute("userList", UserList);
然后我如下填充下拉列表。
<c:forEach items="$userList" var="c" >
`<html-el:option value="$c.id"><c:out value="$c.name"/></html-el:option> </c:forEach>
可能有一个简单的答案,但是如何对这些名称进行排序?
【问题讨论】:
Sun 对象排序教程:java.sun.com/docs/books/tutorial/collections/interfaces/… 相关问题:***.com/questions/1814095/… 【参考方案1】:您通常通过以ArrayList
作为参数调用public static Collections.sort(List<T> list)
来执行此操作,但请注意实现Comparable
接口,否则它将不起作用(如果它们是Strings
,那么它已经实现了):
Collections.sort(yourList);
否则,如果您有一个自定义类,但您想对内部的某个字符串字段进行排序,您可以委托compareTo
方法:
public class User implements Comparable<User>
public int compareTo(User other)
return userName.compareTo(other.userName);
最后,如果没有人是您的情况,只需滚动您自己的 compareTo
方法,如果调用对象小于、等于或大于传递的对象,它应该返回 -1
、0
或 1
。
【讨论】:
我将试一试自定义类,因为我假设 Collections.sort 不能与包含字符串和 int 类型对象的 arrayList 一起使用 @Michael:它 IS 已经是一个自定义类了!它至少有id
和name
属性;)这是您自己的代码还是您必须维护现有项目?
扩展现有项目...您可能会说:P 我不知道您的意思是在现有类上实现 Comparable。我出于学习目的而尝试这样做,但对于这个特殊问题,我将通过上面建议的数据库查询来完成
感谢 balus 修复该代码,我只是太懒了,复制/粘贴了它:)
关于如何在 jsp 中执行此操作的任何建议?【参考方案2】:
Michael,您应该使用连接和排序来从数据库中获取这些数据,而不是在 Java 中检索和排序:
select person.id, person.name from person inner join person_company using(personid)
order by person.name;
并且不要尝试在 java 中进行排序和执行此操作(上面的语法可能并不完美,我的 mysql 有点生疏)。
【讨论】:
老实说,我不知道我是怎么错过内连接的概念的。这是我跳到上面的一个模式,这可能就是原因。但它更干净、更容易,所以谢谢你给我看!!我做了以下 SELECT company.id, company.name from company INNER JOIN user_company ON company_id = user_company.CompanyId WHERE user_company.UserId='UserIDVariable' ORDER BY name;【参考方案3】:我认为这个问题最理想的解决方案是在数据库查询级别对它们进行排序。如果表的索引很好,这将是最快且有争议的“最佳”做法。
话虽如此,如果您只是想对该列表进行排序而不是开始在数据库方面进行处理,请使用 Collections.sort 并让您的 UserList 实现 Comparable<UserList>
小心使用不区分大小写的字符串比较,否则您的用户可能不会欣赏排序结果。
【讨论】:
【参考方案4】:我会更改数据库查询以按照您想要的顺序返回行。
如果您使用 SQL,查询可能如下所示。
SELECT Id, Name FROM Person ORDER BY Name;
与在代码中执行此操作相比,这具有一些优势。
速度更快。 您不必更改代码。 工作量少。【讨论】:
这对我查询的方式不起作用(如果我错了,请原谅我)。我正在迭代我的查询使用的整数数组。即 SELECT Id, NAME FROM Person WHERE id='"+variable+"';我做的每一个查询,我都会在我的 ArrayList 中添加一个对象 所以 ORDER BY 将毫无意义,因为每次查询只返回一条记录 @Michael,这是查询数据库的糟糕方法。对于任何不平凡的记录,它都会非常慢。而是使用:Select id, name from person where id in (variable, variable, variable) 按名称排序。你从哪里得到这个 ID 列表?如果是从数据库中查询,应该一次性从数据库中查询出来。 Id 列表来自数据库,但来自单独的表。我有一个 user_company 表,我在其中传递了公司 ID(第 1 列)并从相关行中检索用户 ID。然后我使用这些 id 来查询用户表以检索他们的姓名。所以我想,这个问题的主题。什么是更简单的mysql查询来做到这一点?我的整个数据库/mysql 知识都是原始的 我同意一晒。编辑:只需加入表格!有关这方面的信息可以在这里找到:w3schools.com/sql/sql_join.asp您可能还想阅读更多关于 SQL 的一般信息。【参考方案5】:您可以尝试覆盖 UserList 的 compareTo 方法,以便它根据某些字符串值以字母顺序比较元素。然后,调用数组列表的 sort 方法,它应该使用您覆盖的 compareTo 对它们进行排序。
【讨论】:
【参考方案6】:您可以在数据库中排序,而不是使用
触发许多查询select Id, Name from Person where id = '+variable+';
您可以遍历变量并制作一个逗号分隔的列表,这样您只需触发一个查询
int[] variableList = wherever_you_get_it_from;
StringBuffer csv = new StringBuffer();
for (int i = 0; i < variableList.length; i++)
csv.append(variableList[i]);
if (i < variableList.length - 1)
csv.append(",");
然后给
select Id, Name from Person where id in ( +csv.toString()+) order by Name;
由于您是从公司表中获取用户 ID,因此您可以加入并获取
select u.usrid, u.name from company c left join user u on c.usrid = u.usrid
where c.companyid in (comapnyid1, companyid2, companyid3) order by u.name;
【讨论】:
【参考方案7】:你应该使用Collections.sort
和任何一个
-
让你的用户类实现
Comparable
接口
创建一个UserListComparator
实现Comparator<UserList>
接口
详见Comparable
接口文档。
【讨论】:
以上是关于按字母顺序获取对象的java集合的主要内容,如果未能解决你的问题,请参考以下文章