有没有人知道Java中有一个元素列表的类,以便元素可以被任何元素成员排序? 这个想法基本上是有一些类似数据库表的实现,你可以在其中添加要排序的字段。举例说明:
SomeTable table = new SomeTable();
table.addField("name", String);
table.addField("age", int);
table.addField("hair color", String);
table.add(new Object[]{"Thomas", 32, "brown"});
table.add(new Object[]{"Jack", 34, "black"});
table.sort("age")
会对表格进行排序,以便托马斯是第一个元素,而table.sort("name")
会对表格进行排序,以便杰克成为第一个元素。
我可以自己编写类似的东西(实际上我曾经做过一次),但我很想知道是否有一个现成的库来做这些事情(没有数据库)。
PS:我知道int
不是一个类,但这不是重点。此示例代码仅用于显示我期望的功能类型。
答案 0 :(得分:4)
您必须使用Collection.sort()
界面考虑Comparator
功能。有一个很好的例子here
答案 1 :(得分:3)
我能想到的最接近的事情是Apache Commons BeanUtils API。例如,对于“学生”表。
DynaProperty[] props = new DynaProperty[]{
new DynaProperty("firstName", String.class),
new DynaProperty("lastName", String.class),
new DynaProperty("address", java.util.Map.class)
};
BasicDynaClass dynaClass = new BasicDynaClass("student", null, props);
给出这些学生对象的集合表。我们定义了一个BeanComparator
BeanComparator surnameComparator
= new BeanComparator("lastname");
Collections.sort(table, surnameComparator);
不确定这是否是您正在寻找的,但似乎非常接近。
答案 2 :(得分:3)
Publicobject的glazedlists几乎完全符合您的要求。我已将其用于simillar报告生成要求。它本质上是一种为内存列表提供视图的机制。您的视图可以进行排序,过滤,并通常以各种方式进行转换。它还有一个简单的更新机制,因此您可以在主列表中插入新项目,所有筛选/排序的视图都将看到更新事件。
传统上它作为Swing网格/ JTable的支持模型非常受欢迎,但它与Swing API无关,可以在任何缓存列表的地方使用。
当我使用它时,我们在内存中只有几千个对象,性能非常好。不知道它如何扩展到巨大的数字。
答案 3 :(得分:1)
答案 4 :(得分:1)
Google Collections Library有一种类似于Multimap的东西。根据API文档:
“类似于Map的集合,但可以将多个值与一个键相关联。如果您使用相同的键但不同的值调用put(K,V)两次,则multimap包含来自的映射。这两个价值观的关键。“
因此,您可以将名称作为键,然后拨打put("Thomas", 32);
,然后拨打put("Thomas", "brown");
等。
如果您使用此界面的TreeMultimap实现,则可以传入Comparator进行排序/排序。
答案 5 :(得分:1)
至少存在一个支持排序的javax.sql.rowset实现。
许多Swing TableModel
扩展允许排序(我认为这是教程示例)。即使你没有做GUI的东西,也不要害怕“Swing”位。大多数Swing模型根本不涉及“真正的”Swing组件,因此可以认为是完全独立的(除了错误的命名)。
答案 6 :(得分:0)
ArrayList