簡體   English   中英

從數組列遞歸獲取字符串

[英]Recursively get strings from array columns

我有一個對象數組。 每個數組元素的內容可以是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.....
}

請幫忙。 謝謝

我建議使用ArrayList依次將所有平展的數組添加在一起。 您可以創建一個合並當前“結果” -Array和遞歸調用返回的Array的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();
}

我沒有對此進行測試,但我認為應該可以!

希望能有所幫助。

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

希望你的意思。
尚未測試,但應該可以...

這是一個簡單的方法。 我使用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;
}

是的,這是可能的,也許不是最好的方法。

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

我沒有測試過,但是我希望可以給你這個主意

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM