大灰狼 快来

小呆呆呆 2010-07-30 10:03:51
import org.eclipse.jface.viewers.TreeViewer;

我有一个RCP工程,有字符串若干,如(aaa/bbb/ccc),(aaa/eee/fff),(eee/fff)
我要根据字符串创建一个treeviewer.
大家如果不知道treeviewer也没关系,告诉我怎么用字符串创建java的树就可以了,谢谢了。
上面字符串,建成的树如下:

aaa
bbb
ccc
eee
fff
eee
fff


上面的我发在JAVA区没人理,只好发算法区了~
如果不会JAVA,c++写也可以
...全文
372 点赞 收藏 29
写回复
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
maddemon 2010-08-27
直接按字符串首字母排序,显示最后一个。 / 的个数为深度(缩进)
回复
michaellufhl 2010-08-21
OO思路:

design pattern 里面的composite就能解决这个递归结构:
	interface Folder{
void visit();
}

class Node implements Folder{

@Override
public void visit() {
//Do visit logic
}}

class Tree implements Folder{
List<Folder> children;

@Override
public void visit() {
for(Folder f:children){
f.visit();
}

}

}

回复
FancyMouse 2010-08-03
[Quote=引用 19 楼 superdullwolf 的回复:]
更多的人用父子结构来存储树,在实际应用中,多数情况下,我认为不如哈希。
因为很多应用会导致递归,尤其是在web开发显示一个菜单的时候。
[/Quote]用hash就是选择忽视原数据的树结构。要是有一个“枚举该节点的所有子节点”这种操作的话hash立马趴下。
回复
woshixiaonuo 2010-08-02
拿分。。。
回复
fenix124 2010-08-02
string[] strings=xxx.split("/");
node = root;
for(i = 0;i < strings.length;i++)
{
if(!node.contains(strings[i]))node.addchild(strings[i]);
node = node.getchild(strings[i]);
}
回复
lzc52151 2010-08-02
也是以前做plung-in时写的
----------------
package tree;

import java.util.List;
public interface ITreeEntry {
public String getId();

public void setId(String id);

public String getName();

public void setName(String name);

public String getType();

public void setType(String type);

public String getValue();

public void setValue(String value);

public void setChild(Entity child);

public List<ITreeEntry> getChildren();

public void setParent(Entity parent);

public Entity getParent();

public void printChildrenPreorder(List<ITreeEntry> entityList);

public void printChildrenLevel(List<ITreeEntry> entityList);

public void printEntity();
}
-----------------------------
package tree;
import java.util.List;
import java.util.ArrayList;

public class Entity implements ITreeEntry {

private String id = "";
private String name = "";
private String type = "";
private String value = "";
private List<ITreeEntry> children = new ArrayList<ITreeEntry>();
private Entity parent = null;

public Entity() {
}

public Entity(String id,String name,String type,String value) {
this.id = id;
this.name = name;
if (type!=null){
this.type = type;
}
if (value!=null){
this.value = value;
}
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getType() {
return type;
}

public void setType(String type) {
this.type = type;
}

public String getValue() {
return value;
}

public void setValue(String value) {
this.value = value;
}

public void setChild(Entity child) {
this.children.add(child);
child.setParent(this);
}

public List<ITreeEntry> getChildren() {
return children;
}

private void setParent(Entity parent) {
this.parent = parent;
}

public Entity getParent() {
return parent;
}

public void printChildrenPreorder(List<ITreeEntry> entityList) {
Entity en ;
for(int j=0;j<entityList.size();j++){
en = (Entity)entityList.get(j);
en.printEntity();
if (en.getChildren().size()>0){
en.printChildrenPreorder(en.getChildren());
}
}
}

public void printChildrenLevel(List<ITreeEntry> entityList) {
Entity en ;
for(int j=0;j<entityList.size();j++){
en = (Entity)entityList.get(j);
en.printEntity();
}
for(int j=0;j<entityList.size();j++){
en = (Entity)entityList.get(j);
if (en.getChildren().size()>0){
en.printChildrenLevel(en.getChildren());
}
}
}

public void printEntity(){
System.out.println(this.getId() + " " + this.getName() + " " + this.getType() + " " + this.getValue());
}
}
回复
小呆呆呆 2010-08-02
最后还是我自己搞定
回复
小呆呆呆 2010-08-02
大笨狼,你看你回复这么不及时,菜都凉了~ 唉
回复
超级大笨狼 2010-07-31
实际应用,树的数据一般是存储在数据库,配置文件等非内存场所。
所以要考虑非内存场所的特点,比如数据库,SQL语句。

SQL语句的特点是用001001002这样的字串编码查询父子关系非常方便。可以like
但是用id和pid父子关系,就要写递归的function

所以在数据库里用001001002这样的“伪哈希”字串编码比较划算。
回复
超级大笨狼 2010-07-31
更多的人用父子结构来存储树,在实际应用中,多数情况下,我认为不如哈希。
因为很多应用会导致递归,尤其是在web开发显示一个菜单的时候。
回复
超级大笨狼 2010-07-31
这个树,实际上是为了显示,注意根据深度缩进。
在数据结构中可以用十字链表,也可以用哈希表001002这样的字串做Key.
回复
小呆呆呆 2010-07-30
大家给点代码吧,太痛苦哦
回复
leafsoar 2010-07-30
[Quote=引用楼主 jamielover 的回复:]
import org.eclipse.jface.viewers.TreeViewer;

我有一个RCP工程,有字符串若干,如(aaa/bbb/ccc),(aaa/eee/fff),(eee/fff)
我要根据字符串创建一个treeviewer.
大家如果不知道treeviewer也没关系,告诉我怎么用字符串创建java的树就可以了,谢谢了。
上面字符串,建成的树如下:
C/C++……
[/Quote]
如果是我,大概思路是这样的,首先建立一棵树,包含(aaa/bbb/ccc)
然后将(aaa/eee/fff)中的aaa与这棵树的第一个节点对比,
规则1:相同则对比它们的子节点(再进行对比,同样满足两个规则)
规则2:不相同添加此节点到同等级节点,后添加剩余节点

最后拿第三个(eee/fff),与当前这棵树对比
回复
小呆呆呆 2010-07-30
主要是怎么判断当前节点已经找到,这个条件怎么写
回复
小呆呆呆 2010-07-30
[Quote=引用 2 楼 zhaolinger2 的回复:]

java的话,构造一个节点类,类成员包括一个String和一个List,List里装的是这个节点类的对象。
遍历所有的字符串,每一个字符串用斜线分割成多个字符串段,根据顺序构造节点对象,然后就ok了。
[/Quote]
能贴代码吗,谢谢啦
回复
namewchwch 2010-07-30
建树 + 深度优先搜索。
回复
zhaolinger2 2010-07-30
java的话,构造一个节点类,类成员包括一个String和一个List,List里装的是这个节点类的对象。
遍历所有的字符串,每一个字符串用斜线分割成多个字符串段,根据顺序构造节点对象,然后就ok了。
回复
zhaolinger2 2010-07-30
C++的话……
建树+遍历,够简单吧?
回复
小呆呆呆 2010-07-30
我看看~ 谢谢大家
回复
zhuzeitou 2010-07-30
额,再修改……
TreeNode的SetParent方法应该去除……

其实parent这个成员变量本来想干些事情的,后来被忽略了,现在留着并无意义,删掉也无妨
回复
发动态
发帖子
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
社区公告
暂无公告