2011-03-17 57 views
0

我有一個對象數組。每個數組元素的內容可以是字符串,也可以是具有字符串的另一個數組。或者它可以是一個包含字符串的數組的數組。以遞歸方式從數組列中獲取字符串

實施例:

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

or: Object obj2 =array [str1, str2] 

or: Object obj3 = "this string" 

我需要這需要該對象作爲參數,並且如果它是第一2箱子一個,返回與這些元素單一陣列的方法。如果它是最後一種情況,它將返回包含作爲參數進入的單個字符串元素的數組。

所以,如果我做

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..... 
} 

請幫忙。 Thanx

+0

什麼語言是這樣,C#?哦,等等... instanceof不是C#關鍵字...也許是Java? – BlueMonkMN 2011-03-17 11:17:51

+0

可以請你添加一個例子嗎?我不認爲我明白你需要做什麼。 – amit 2011-03-17 11:24:54

+0

@amit:我加了個例子! – Julia 2011-03-17 11:30:50

回答

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; 
} 
1

我推薦使用ArrayList將所有展平的數組順序添加在一起。你可以創建一個數組合並當前的「result」--Array和由遞歸調用返回的數組,但使用ArrayList可以更容易。這樣你就不必迭代兩個數組,並將它們放在一個數組中。

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
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); 
    } 
    } 
} 

希望你的意思。
還沒有測試,但應該工作....

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; 
} 

我沒有測試它,但我希望能給你的想法

+0

這一個不會工作,因爲調用newArray [i] = getDataForColumn(castarray [i]);將數組放入newArray中。這不會將它壓扁成我認爲的一個字符串數組。 (在紙上測試,不起作用)。假設你將一個類似[a,b,[c,d]]的數組放入方法中。結果將只是該數組的一個副本。 – Chris 2011-03-17 11:47:10