2009-02-19 51 views
2

有人知道Java中有一個類的元素,這樣元素就可以被任何元素成員排序嗎? 這個想法基本上是有一些類似數據庫表的實現,你可以在其中添加字段進行排序。爲了說明:可排序類似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")將表格進行排序。我可以自己編寫這樣的代碼(實際上我曾經這樣做過),但是我只是很好奇,看看是否有一個現成的庫來做這種事情(沒有數據庫)。我知道int不是一個類,但這不是重點。這個示例代碼就是爲了展示我期望的功能類型。


回答

3

我能想到自己的最接近的事是Apache下議院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); 

不知道這是你在找什麼,但它似乎很接近。

+0

幾乎我在找什麼。謝謝! – tehvan 2009-02-22 08:42:41

4

您必須考慮Collection.sort()功能,與Comparator接口。有一個很好的例子here

1

Google Collections Library有一種類似的東西叫做Multimap。根據API文檔:

「一個類似於Map的集合,但它可能會將多個值與一個關鍵字相關聯。如果使用相同的鍵但不同的值調用put(K,V)兩次, multimap包含從這個鍵到這兩個值的映射。「

所以你可以有名稱爲重點,並呼籲put("Thomas", 32);然後put("Thomas", "brown");

如果使用TreeMultimap實現這個接口,你可以在一個比較通過排序/排序的。

+0

我不認爲這對地圖有很大的用處;在這種情況下,你的通用參數V是什麼? Multimap實際上是一個具有更好接口的Map >,而OP需要的更像Map >。 – 2009-02-19 11:35:19

1

至少存在一個支持排序的javax.sql.rowset實現。

許多Swing TableModel擴展允許排序(我認爲這是教程示例)。即使你沒有使用GUI,也不要害怕「Swing」位。大多數Swing模型根本不涉及「真正的」Swing組件,因此可以被認爲是完全獨立的(除了錯誤的命名)。

3

Publicobject的glazedlists幾乎完全符合您的要求。我已將它用於相似報告生成要求。它本質上是一種讓你在記憶列表中查看的機制。您的視圖可以進行排序,過濾,並通常以各種方式進行轉換。它也有一個簡單的更新機制,所以你可以在你的主列表中插入新的項目,所有過濾/排序的視圖將看到更新事件。

傳統上,它作爲Swing網格/ JTables的支持模型已經非常流行,但它絕不會與Swing API綁定,並且可以在您緩存列表的任何位置使用。

當我使用它時,我們在內存中只有幾千個對象,性能非常好。不知道它如何擴大到龐大的數字。

0
  • 創建一個名爲「姓名」,「年齡」字段的一類,「髮色」那類與比較自定義比較
  • 認沽實例爲ArrayList
  • 使用Collections.sort()一個特定的字段