Java中具有泛型类的树遍历

无论123

确切地说,我试图使一棵树变平,并且我一直试图使用泛型函数来获取泛型类中私有属性的值。

我已经附加了这些类,以显示树的确切结构。但是看起来像这样:

  /|\
 1 | 6
  /|\
 5 4 9

我将在最后粘贴我的尝试。首先,让我介绍一下这些类:

三元组只是存储三个相同类型的值。

public class Triple<V> {
    private final V l, m, r;
    public Triple(V l, V m, V r) {
        this.l = l;
        this.m = m;
        this.r = r;
    }
    public V left()   { return l; }
    public V middle() { return m; }
    public V right()  { return r; }
}

简单的界面:

public interface Function<P, R> {
     R apply(P p);
}

现在,上一个棘手的课程。该类型只是一种存储两种类型的值之一的EitherOr,但不能同时存储两种类型的值。

public class EitherOr<A,B> {
    // Constructs a left-type EitherOr
    public static <A> EitherOr left(A a) {
         return new EitherOr(a, null);
    }
    // Constructs a right-type EitherOr
    public static <B> EitherOr right(B b) {
         return new EitherOr(null, b);
    }
    private final A a;
    private final B b;

    private EitherOr(A a, B b) {
         this.a = a; this.b = b;
    }

    public<T> T ifLeft(Function<A,T> f) {
        return f.apply(a);
    }

public<T> T ifRight(Function<B,T> f) {
        return f.apply(b);
    }

    public boolean isLeft() {
        return b == null;
    }
}

我知道这已经很长了,但请忍受。此类实现树结构。

public interface Tree<T> {
    EitherOr<T, Triple<Tree<T>>> get();

    static final class Leaf<T> implements Tree<T> {
           public static <T> Leaf<T> leaf (T value) {
                return new Leaf<T>(value);
           }

           private final T t;

           public Leaf(T t) { this.t = t; }

           @Override
           public EitherOr<T, Triple<Tree<T>>> get() {
                 return EitherOr.left(t);
           }
    }

    static final class Node<T> implements Tree<T> {
         public static <T> Tree<T> tree (T left, T middle, T right) {
             return new Node<T>(Leaf.leaf(left), Leaf.leaf(middle), Leaf.leaf(right));
     }

         private final Triple<Tree<T>> branches;

         public Node(Tree<T> left, Tree<T> middle, Tree<T> right) {
               this.branches = new Triple<Tree<T>>(left, middle, right);
         }

         @Override
         public EitherOr<T, Triple<Tree<T>>> get() {
                 return EitherOr.right(branches);
         }
    }
}

好的。这是我扁平化的想法:

public class MyFlattenTree<T> implements FlattenTree<T> {
    public List<T> flattenInOrder(Tree<T> tree) {
          List<T> list = new ArrayList<T>();
          EitherOr<T, Triple<Tree<T>>> EitherOr;
          EitherOr = tree.get();
          // it is a leaf
          if (EitherOr.isLeft()) {
               // This is where the problem lies
               // I don't how to get the value using a function f
               list.add((T) EitherOr.ifLeft(f));
               return list;
          }
          else {
               // basically recursively go through the tree somehow
          }
          return null;
    }
}

就像我说的那样,我坚持尝试使用Function接口检索EitherOr类中的值。我正在考虑实现Function接口并为“ apply”编写一个仅获取值的函数,但是我不确定如何做到这一点。任何帮助,将不胜感激。谢谢!

ccjmne

因此,这是您的flattenInOrder方法:

public List<T> flattenInOrder(final Tree<T> tree) {
    final EitherOr<T, Triple<Tree<T>>> EitherOr = tree.get();
    if (EitherOr.isLeft()) {
        return Collections.singletonList(EitherOr.ifLeft(this.ifLeftFunction));
    }

    return EitherOr.ifRight(this.ifRightFunction);
}

非常简单,假设:

  • ifLeftFunction产生单个元素(如果为“ left”,则EitherOr<T, Triple<Tree<T>>>具有单个Telem')

...和:

  • ifRightFunction产生元素的集合(因为如果是“正确”,则EitherOr<T, Triple<Tree<T>>>具有元素列表T

现在让我们看一下这些功能:

ifLeftFunction是...基本的。我想T从...中提取一个T

final Function<T, T> ifLeftFunction = new Function<T, T>() {

    @Override
    public T apply(final T t) {
        return t;
    }
};

ifRightFunction稍微复杂一点:它必须是递归的,并T从正在浏览的Tree中收集所有

final Function<Triple<Tree<T>>, List<T>> ifRightFunction = new Function<Triple<Tree<T>>, List<T>>() {

    @Override
    public List<T> apply(final Triple<Tree<T>> t) {
        final List<T> res = new ArrayList<>();
        res.addAll(MyFlattenTree.this.flattenInOrder(t.left()));
        res.addAll(MyFlattenTree.this.flattenInOrder(t.middle()));
        res.addAll(MyFlattenTree.this.flattenInOrder(t.right()));
        return res;
    }
};

而且...您完成了!


示例工作代码:

public class MyFlattenTree<T> {

    private final Function<Triple<Tree<T>>, List<T>> ifRightFunction = new Function<Triple<Tree<T>>, List<T>>() {

        @Override
        public List<T> apply(final Triple<Tree<T>> t) {
            final List<T> res = new ArrayList<>();
            res.addAll(MyFlattenTree.this.flattenInOrder(t.left()));
            res.addAll(MyFlattenTree.this.flattenInOrder(t.middle()));
            res.addAll(MyFlattenTree.this.flattenInOrder(t.right()));
            return res;
        }
    };

    private final Function<T, T> ifLeftFunction = new Function<T, T>() {

        @Override
        public T apply(final T t) {
            return t;
        }
    };

    public static void main(final String[] args) {
        final Tree<String> tree = new Node<>(new Leaf<>("1"), new Node<>(new Leaf<>("5"), new Leaf<>("4"), new Leaf<>("9")), new Leaf<>("6"));
        System.out.println(new MyFlattenTree<String>().flattenInOrder(tree));
    }

    public List<T> flattenInOrder(final Tree<T> tree) {
        final EitherOr<T, Triple<Tree<T>>> EitherOr = tree.get();
        if (EitherOr.isLeft()) {
            return Collections.singletonList(EitherOr.ifLeft(this.ifLeftFunction));
        }

        return EitherOr.ifRight(this.ifRightFunction);
    }
}

请注意,我正在Tree使用以下main方法在您的问题中创建您要作为示例显示的确切名称

public static void main(final String[] args) {
    final Tree<String> tree = new Node<>(new Leaf<>("1"), new Node<>(new Leaf<>("5"), new Leaf<>("4"), new Leaf<>("9")), new Leaf<>("6"));
    System.out.println(new MyFlattenTree<String>().flattenInOrder(tree));
}

输出: [1, 5, 4, 9, 6]


干杯;)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java:具有泛型方法的泛型类

来自分类Dev

C ++ / Qt中具有泛型的抽象类

来自分类Dev

类中具有2个泛型类型的方法,其中1个泛型类型

来自分类Dev

在具有不同泛型参数的抽象类中返回泛型是不好的做法

来自分类Dev

类中具有2个泛型类型的方法,其中1个泛型类型

来自分类Dev

c#中具有泛型类的泛型方法

来自分类Dev

具有泛型构造函数的泛型类?

来自分类Dev

Java中的泛型类

来自分类Dev

具有泛型的Scala类型类

来自分类Dev

具有接口类类型的泛型

来自分类Dev

在泛型类中实例化 Java 泛型类

来自分类Dev

Java中具有泛型声明的ArrayList

来自分类Dev

Java中具有泛型的静态多态

来自分类Dev

Java中具有泛型的静态多态

来自分类Dev

Kotlin 和 Java 中带有嵌套类的泛型

来自分类Dev

java中带有泛型的类字面量

来自分类Dev

如何正确创建在Java中扩展泛型接口的有界泛型类

来自分类Dev

Java泛型类中的超类

来自分类Dev

Swift中具有新泛型的泛型扩展

来自分类Dev

在具有泛型类型的类中定义的数据类的类型提示

来自分类Dev

具有泛型的Java排序集合

来自分类Dev

如何在C#中遍历泛型类的属性?

来自分类Dev

具有继承的类类型的泛型列表的类

来自分类Dev

如何在C#中收集具有泛型类型的静态类的所有“实例”?

来自分类Dev

Java中的泛型超类

来自分类Dev

java类中的多个泛型类型

来自分类Dev

在java中扩展多个类的泛型

来自分类Dev

C#泛型类作为参数,与泛型类的调用方法具有相同的T

来自分类Dev

C#泛型类作为参数,与泛型类的调用方法具有相同的T