代码之家  ›  专栏  ›  技术社区  ›  tehvan

类似Java类的可排序表

  •  2
  • tehvan  · 技术社区  · 17 年前

    有人知道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 这不是一个类,但这不是重点。这个示例代码只是为了展示我所期望的功能。


    7 回复  |  直到 9 年前
        1
  •  4
  •   Jérôme    17 年前

    你必须考虑 Collection.sort() 功能,与 Comparator 界面。有一个很好的例子 here

        2
  •  3
  •   Il-Bhima    17 年前

    我能想到的最接近我自己的东西是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);
    

    不确定这是否是你要找的,但它似乎很接近。

        3
  •  3
  •   serg10    17 年前

    公共对象 glazedlists 几乎完全符合你的要求。 我已将其用于类似的报告生成要求。它本质上是一种为您提供内存列表视图的机制。您的视图可以进行排序、过滤,并通常以各种方式进行转换。它还有一个简单的更新机制,因此您可以在主列表中插入新项目,所有经过筛选/排序的视图都会看到更新事件。

    传统上,它作为Swing网格/JTables的支持模型非常流行,但它与Swing API无关,可以在缓存列表的任何地方使用。

    当我使用它时,我们的内存中只有几千个对象,性能非常出色。不知道它是如何扩展到巨大的数字的。

        5
  •  1
  •   marktucks    17 年前

    Google Collections Library 有一种类似的东西叫做a Multimap .根据API文件:

    类似于Map的集合,但可能将多个值与单个键相关联。如果使用相同的键但值不同,调用put(K,V)两次,则多映射包含从键到两个值的映射

    所以你可以把名字作为钥匙,然后呼叫 put("Thomas", 32); 然后 put("Thomas", "brown"); 等等

    如果你使用 TreeMultimap 实现此接口时,您可以传入一个用于排序/排序的Comparator。

        6
  •  1
  •   Tom Hawtin - tackline    17 年前

    至少存在一个支持排序的javax.sql.rowset实现。

    许多摇摆 TableModel 扩展允许排序(我认为这是教程示例)。即使你不做GUI工作,也不要害怕“Swing”。大多数Swing模型根本不引用“真正的”Swing组件,因此可以被认为是完全独立的(除了命名错误)。

        7
  •  0
  •   Michael Borgwardt    17 年前
    • 创建一个名为“姓名”、“年龄”、“发色”的类
    • 将该类的实例放入 ArrayList
    • 将Collections.sort()与比较特定字段的自定义比较器一起使用