递归地从数组列中获取字符串

时间:2011-03-17 11:15:06

标签: java arrays recursion

我有一个对象数组。每个数组元素的内容可以是String,也可以是带字符串的另一个数组。或者它可以是包含字符串的数组的数组。

示例:

Object obj1 = array[[str1, str2, str3], [str4, str5]] 

or: Object obj2 =array [str1, str2]

or: Object obj3 = "this string"

我需要一个将此对象作为参数的方法,如果它是前两种情况之一,则返回包含这些元素的单个数组。如果它是最后一种情况,它将返回带有作为参数的单个字符串元素的数组。

所以,如果我这样做

getDataForColumn(obj1) i get array: [str1, str2. str3....str5]
getDataForColumn(obj2) i get array: [str1, str2] //same as input, i know
getDataForColumn(obj3) i get array: ["this string"]     

我正在尝试,但我真的无法用递归来解决这个问题,也不可能,至少在这种情况下是这样。

这就是我想出来的,并且卡住了。

private static Object[] getDataForColumn(Object column) {

if(column instanceof Object[]){
    Object[] castarray = (Object[])column;
        Object[]newArray = new Object[castArray.length];

    for (int i = 0; i < castarray.length; i++) {

              if((castarray[i] instanceof Object[])){
                 //recursion, but how :D    
                  }
               else{
                        newArray[i] = castArray[i];     
        }
    }
      return newArray;
   }    
 return new array with object that came in.....
}

请帮忙。 感谢名单

4 个答案:

答案 0 :(得分:1)

我建议使用ArrayList将所有展平的数组依次添加到一起。你可以创建一个数组合并当前的“结果”-Array和递归调用返回的数组,但是使用ArrayList可以更容易。这样您就不必迭代两个Arrays并将它们放在一个Array中。

private static Object[] getDataForColumn(Object column) {
ArrayList results = new ArrayList();

if(column instanceof Object[]){

    Object[] castarray = (Object[])column;

    for (int i = 0; i < castarray.length; i++) {

          if((castarray[i] instanceof Object[])){
             results.addAll(Arrays.asList(getDataForColumn(castarray[i])))    
           }
           else{
             results.add(castarray[i]);    
           }
    }
    return results.toArray();
}

我没有对此进行测试,但我认为应该可行!

希望有所帮助。

答案 1 :(得分:1)

getDataFromColumn(Object column) {
  List<String> list = new LinkedList<String>();
  recGetData(column,list);
  return list.toArray();
}
public void recGetData(Object column,List<String> list) {
  if (column instanceof String) {
     list.add((String)column);
  } else {
     for (Object o : (Object[])column) { 
      recGetData(o,list);
     }
  }
}

希望你的意思。
没有测试它,但应该工作....

答案 2 :(得分:1)

这是一个简单的方法。我使用List因为我更喜欢它在数组上,但当然你可以创建一个包装器,最后将它转换为数组:

public static List<String> flat(Object o)
{
    List<String> strings = new ArrayList<String>();
    if (o.getClass().isArray())
    {
        Object[] oarr = (Object[]) o;
        for (Object obj : oarr)
        {
            strings.addAll(flat(obj));
        }
    }
    else
    {
        strings.add(o.toString());
    }
    return strings;
}

答案 3 :(得分:0)

是的,有可能,也许不是最好的方式。

private static Object[] getDataForColumn(Object column) {
    if(column instanceof Object[]){
       Object[] castarray = (Object[])column;
       Object[] newArray = new Object[castArray.length];

       for (int i = 0; i < castarray.length; i++) {
          newArray[i] = getDataForColumn(castarray[i]);
       }

    } else {
       String[] newArray = {column};
    }
    return newArray;
}

我没有测试它,但我希望能给你这个想法