大家來幫忙想一想 (JAVA 的問題...)我有一個TABLE,裡面有以下資料:ID        Master ID        Product        Product Desct
1        1        Type1        
2        1        SubItem1        
3        2        SubSubItem1        Desc of Sub Sub item
4        2        SubSubItem2        Desc of Sub Sub item
5        2        SubSubItem3        Desc of Sub Sub item
6        1        SubItem2        
7        6        SubSubItem4        Desc of Sub Sub item
8        6        SubSubItem5        Desc of Sub Sub item
9        2        SubSubItem6        Desc of Sub Sub item
....
然後我在JAVA裡,放到array裡,(或者是用VECTOR,不清楚....):
Type1-->SubItem1-->{SubSubItem1, SubSubItem2, SubSubItem3,SubSubItem6}
Type1-->SubItem2-->{SubSubItem4,SubSubItem5}然後, 人們在輸入資料時只需輸入:
Type1.   <-- 就能出現 SubItem1 和 SubItem2的選項
Type1. SubItem1. <-- 就能出現 SubSubItem1, SubSubItem2, SubSubItem3和 SubSubItem6的選項
Type1. SubItem2. <-- 就能出現 SubSubItem4和 SubSubItem5的選項
大家會知是什麼方法做出來的? 說說思路也行~ (有相關參考的CODE更好)

解决方案 »

  1.   

    楼主搜索一下 3级联动。
    这里有个纯jsp的:
    http://blog.csdn.net/Rainpoem/archive/2006/03/28/641624.aspx
      

  2.   


    新年快乐。你应该有ajax实现的无刷新3级联动吧?共享下撒
      

  3.   

    crazylaa 朋友, 這個三級聯動的方法沒有在我這個設計中起作用,我這個不是普通的三級聯動!
    是一個可以造到多級關係的方法,所有關係都存在一個資料表中!
    在提取時,要做到:取一次,放在ARRAY裡,然後在ARRAY裡找資料,而不需時常到資料庫裡找,以減少連結次數!
      

  4.   


    好的,台湾朋友,我只能给个思路,可能不对,效率可能也不高:
    取到表(就是你的资料库啦)里所有记录,用hashmap或Hashtable等来存储数据。
    比如整个结构
    HashMap<String,HashMap<String,ArrayList<String>>>
    就是说最外层的String代表一级的,就是你的 Type1 ,里面那个HashMap的第一个元素的Key就是你的Type1对应要存的SubItem1, ArrayList就对应您的SubSubItem1, SubSubItem2, SubSubItem3和 SubSubItem6;而第二个元素的Key就是你的Type1对应要存的SubItem2, ArrayList就对应您的SubSubItem4和 SubSubItem5。外层用HashMap是觉得加入你还想加入Type2,也可按Type1的方式来加。
    然后获取的时候,就get("Type1").get("SubItem1")就可以得到那个ArrayList。
      

  5.   

    crazylaa, 我是香港那邊的, 業餘JAVA玩友, 不太懂JAVA....
    之前沒用過HASHMAP, 看來像又看來不像,那個解決辦法....
    因為在取得數據庫資料之時,JAVA那邊還沒知道我到底有幾多種TYPE, 可以很多, 也不知每一個TYPE裡有多少個SUBITEM...更難過有多少個SUBSUBITEM....
    用HASHMAP可以做到嗎?
    虛心請教...
      

  6.   

    放到xml中  这一个例子  xml+jsp级联
    http://www.codefans.net/soft/3450.shtml
      

  7.   


    噢,我还以为只有台湾朋友才管数据库表叫资料库呢如果你的表结构就是这个样子,就是说,如果只是N个type->M个SubItem->L个subsubitem,再没有第4层了的话,这个是可以实现的。如果层数不确定,就是说subsubitem下面还有K个sssItem,下面可能有也可能没有,那么这种方式可能没有# zl3450341 # (东走西顾)说的存XML来的方便。xml的节点是可以随意往下扩展的,当然也可以用Tree来实现。
    但是,如果数据量很大,比如type有100个,每个type下面20个subitem,每个subitem下面20个subsubitem的话,会很耗内存的(不管是我这种还是# zl3450341 # (东走西顾)说的存XML那种),因为100×20×20就40000个节点,一般超过1000的数据量就不建议放内存了。
      

  8.   

    zl3450341, 朋友,這個做法和crazylaa建議的三級聯動好像沒分別吧.....
    放到XML裡...只是把問題由ARRAY轉到XML裡....
    對嗎?
      

  9.   

    XML....
    要找找資料,還以為zl3450341朋友的想沒不對,那要試試找XML那方面的資料了...對呀,不止三層,有可能是五至六層的關係表...
    是令人看到就頭痛的東西...
    因為看到QUICKBOOKS 裡的ITEM LIST, 想學學它怎樣做出來~
    您們有玩過嗎?
      

  10.   

    5至6层玩到是玩过15层的不过是从数据库里面直接查,而不是像您这样放内存
    如果层数不定,还是用Tree比较好(其实XML也是类似Tree的结构)XML解析,可以找dom4j或者jdom看看。
      

  11.   

    新年快樂!!如果是由數據庫裡直接找的話,也有一個令人頭痛的問題,因為它是在一個textbox裡出現所有資料
    如最初所講,是在textbox裡輸入:
    Type1.  <-- 就能出現 SubItem1 和 SubItem2的選項 
    Type1. SubItem1. <-- 就能出現 SubSubItem1, SubSubItem2, SubSubItem3和 SubSubItem6的選項 
    Type1. SubItem2. <-- 就能出現 SubSubItem4和 SubSubItem5的選項 是同一個textbox裡,方法會是:在textbox裡加入keytype listener,等到您輸入"."後就再找第下層資料嗎?
      

  12.   

    还是同一个“textbox”啊
    这个如果数据存储在后台某个类里面的话(没有加载到客户端页面),似乎要用ajax才能做到这种效果。。而且可以肯定的告诉你,那不是textbox,是自己写的一个控件。textbox是做不到下拉的。这个用dojo(其底层也是ajax)可以实现。
    如果它的数据是加载到前台页面了,则js+css也可以做到这种效果。另外,它输入 . 可能你说对了,用来表示一次输入结束,开始查找符合的列表。啊对,还有:新年快乐,HongKong Friend
      

  13.   

    如果类似n级联动的话倒是可以用js
      

  14.   

    另外有一個論壇的香港朋友提供了以下的解決方案,看來是暫時最相近的,更不須用XML:import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;public class RecursiveItemTest
    {
        public final static Pattern p =
            Pattern.compile("(\\d+)\\t(\\d+)\\t(.+?)\\t(.*)");    public static void main(String[] args) {
            RecursiveItemTest test = new RecursiveItemTest();        String[] inputs = new String[] {
                    "1        1        Type1        ",
                    "2        1        SubItem1        ",
                    "3        2        SubSubItem1        Desc of Sub Sub item",
                    "4        2        SubSubItem2        Desc of Sub Sub item",
                    "5        2        SubSubItem3        Desc of Sub Sub item",
                    "6        1        SubItem2        ",
                    "7        6        SubSubItem4        Desc of Sub Sub item",
                    "8        6        SubSubItem5        Desc of Sub Sub item",
                    "9        2        SubSubItem6        Desc of Sub Sub item"
            };        Map<Integer, Item> itemMap = new HashMap<Integer, Item>();
            for (String input : inputs) {
                Matcher m = p.matcher(input);
                if (m.find()) {
                    Item item = test.new Item(new Integer(m.group(1)), m.group(3), m.group(4));
                    itemMap.put(item.id, item);                // check master
                    Integer masterId = new Integer(m.group(2));
                    assert itemMap.containsKey(masterId);                // let master add SubItem
                    Item master = itemMap.get(masterId);
                    if (master != item) {
                        master.addSubItem(item);
                    }
                }
            }        for (Item item : itemMap.values()) {
                if (item.isRootElement()) {
                    System.out.println(item);
                }
            }
        }    public class Item
        {
            private Integer id;
            private Item master;
            private String product;
            private String description;
            private List<Item> subItems;
            private int level;        public Item(Integer id, String product, String description) {
                this.id = id;
                this.product = product;
                this.description = description;
                this.subItems = new ArrayList<Item>();
                this.master = this;    // default is a root element
                this.level = 0;
            }        public boolean isRootElement() {
                return master == this;
            }        public void addSubItem(Item item) {
                item.master = this;
                subItems.add(item);
            }        public String toString() {
                String result = "";
                for (int i = 0; i < level; i++) {
                    result += "\t";
                }
                result += product + "\n";            if (subItems.size() > 0) {
                    for (Item item : subItems) {
                        item.level = this.level + 1;
                        result += item.toString();
                    }
                }
                return result;
            }
        }
    }