如何查找容器深度(例如:ArrayList <string> = 1,ArrayList <arraylist <string>&gt; = 2)?

时间:2017-08-03 08:31:30

标签: java templates recursion

例如,在c ++中,我可以找到int = 0,vector&lt; int&gt; = 1,vector&lt; &LT;矢量&lt; int&gt; &gt; = 2由以下内容:

#include <vector>
#include <stdlib.h>

template <typename T>
class Printer{
public:
    static int print(){
        return 0;
    }
};

template <typename T,typename Alloc>
class Printer<std::vector<T,Alloc> >{
public:
    static int print(){
    return 1+Printer<T>::print();
    }
};

int main(){
    printf("%d\n",Printer<int>::print());
    printf("%d\n",Printer<std::vector<int> >::print());
    printf("%d\n",Printer<std::vector<std::vector<int> > >::print());
    return 0;
}

不需要任何实例,例如:

std::vector<int> v;

这样做。如何在Java中实现此功能?我试过了:

public static void print(List<Integer> list){
}

public static <T> void print(List<? extends T> list) {
}

public static <T>void print(){
}

public static void print() {
}

但两者都说&#34;两种方法都有相同的擦除&#34;。我还考虑使用if else:

public static void print(Object obj) {
    if(obj instanceof List){
        List list=(List)obj;
        for(Object obj2 : list){
            print(obj2);
        }
    }else{
    }
}

但是我无法获得函数中的元素类型。是否可以在Java中执行此操作?

2 个答案:

答案 0 :(得分:0)

这是一个递归方法,可以完成你想要实现的目标。始终在初始调用时为depth参数传递0,即计数器。

public static int listDepth(Object obj, int depth){
    if(obj instanceof List){                       //Check if given object is a list
        List<?> list = (List)obj;                  //Retrieve the list
        depth++;                                   //Increment depth counter
        if(list.isEmpty())                         //Nothing in the current list
            return depth;                          //Then return current depth
        else depth = listDepth(list.get(0), depth);//Else call the method on the first element, with the current depth            
    }        
    return depth;                                  //obj is not a List, we return the depth
}

这是一个例子:

ArrayList second = new ArrayList<String>();
ArrayList first = new ArrayList<ArrayList>();

first.add(second);

System.out.println(" Depth : " + listDepth(first, 0));// Output : 2

还有一个:

 ArrayList third = new ArrayList<String>();
 ArrayList second = new ArrayList<ArrayList>();
 ArrayList first = new ArrayList<ArrayList>();

 third.add("Not an array");
 second.add(third);
 first.add(second);

 System.out.println(" Depth : " + listDepth(first, 0));// Output : 3

编辑:用一个检查替换了try / catch,或者列表是空的,因为这是一个更合适的方法。

答案 1 :(得分:-1)

在Java中,“T”将在编译时被删除。 如果您希望获得List的深度,则需要确保此List不为null。比得到第一个并检查该类。

public int getDepth(Object collection){
    return getDepth(collection,1);
}

/**
 * get Collection depth
 * @param depth now depth
 * @return
 */
private int getDepth(Object collection,int depth){
    Object temp;
    if(collection instanceof Collection
            && !((Collection)collection).isEmpty()){
        //get first one
        temp =  ((Collection)collection).iterator().next();
        return getDepth(temp,depth +1 );
    }else {
        return depth;
    }
}

:)