Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 展平深度嵌套的集合_Java_Recursion_Nested Lists - Fatal编程技术网

Java 展平深度嵌套的集合

Java 展平深度嵌套的集合,java,recursion,nested-lists,Java,Recursion,Nested Lists,给定一个类型的对象,包含一组集合对象(参见下面的示例)。我试图将嵌套集展平为单个集合。遇到了TreeTraverser(番石榴图书馆),但不确定它是否是这里的理想解决方案 Example public class Tweet{ int id; String message; DateTime date; Set<Tweet> replies; } Traverse the nested replies Set and place it in a collectio

给定一个
类型的对象,包含一组
集合
对象(参见下面的示例)。我试图将嵌套集展平为单个集合。遇到了TreeTraverser(番石榴图书馆),但不确定它是否是这里的理想解决方案

Example

public class Tweet{
  int id;
  String message;
  DateTime date;
  Set<Tweet> replies;
}

Traverse the nested replies Set and place it in a collection;


for(Tweet a : tweets.replies){
  ...
 for(Tweet b : a.replies){
      ...
     for(Tweet c: b.replies){
       //soo on
     }

 }
}
示例
公共类推文{
int-id;
字符串消息;
日期时间日期;
设置回复;
}
遍历嵌套回复集并将其放置在集合中;
for(Tweet a:tweets.repress){
...
对于(Tweet b:a.回复){
...
对于(推特c:b.回复){
//秀安
}
}
}

为什么不直接使用递归呢

--DFS集合

public void collect(Set<Tweet> tweets, List<Tweet> collector)
{
     for (Tweet tweet: tweets)
     {
          collector.add(tweet); 
          if (tweet.replies != null)
             collect(tweet.replies, collector);
     }

}
public void collect(设置tweets、列表收集器)
{
用于(Tweet-Tweet:tweets)
{
collector.add(tweet);
if(tweet.replays!=null)
收集(tweet.repress,收集器);
}
}
为完整性而编辑。 您也可以使用TreeTraverser,但在我看来,这是一个有点模糊的番石榴特性:

TreeTraverser<Tweet> traverser = new TreeTraverser<Tweet>() {
    @Override
    public Iterable<Tweet> children(Tweet root) {
        return root.replies;        }
};

List<Tweet> allTweets = new ArrayList<Tweet> (traverser.breadthFirstTraversal(root)) 
TreeTraverser遍历器=新的TreeTraverser(){
@凌驾
公共Iterable子项(推文根){
返回root.replays;}
};
List allTweets=newarraylist(traverser.breadthFirstTraversal(root))

递归是否有定义的深度?它们是否可以相互指向?如果没有,那么
TreeTraverser
在这里应该很有用。没有。只需将根节点的回复传递给它。让“tweet”成为您的根tweet列表收集器=new ArrayList();collector.add(tweet);如果(tweet.replays!=null)收集(tweet.replays,收集器);上面的代码将收集所有级别