【问题标题】:Recursively get strings from array columns递归地从数组列中获取字符串
【发布时间】:2011-03-17 11:15:05
【问题描述】:

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

例子:

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

请帮忙。 谢谢

【问题讨论】:

  • 这是什么语言,C#?哦等等……instanceof 不是 C# 关键字……也许是 Java?
  • 你能添加一个例子吗?我想我不明白你需要做什么。

标签: java arrays recursion


【解决方案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;
}

【讨论】:

    【解决方案2】:
    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);
         }
      }
    }
    

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

    【讨论】:

      【解决方案3】:

      我建议使用 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();
      }
      

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

      希望对您有所帮助。

      【讨论】:

        【解决方案4】:

        是的,这是可能的,也许不是最好的方法。

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

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

        【讨论】:

        • 那个不行,因为调用 newArray[i] = getDataForColumn(castarray[i]);将一个数组放入 newArray。我认为这不会将其展平为一个字符串数组。 (在纸上测试,没有用)。假设您将 [a,b,[c,d]] 之类的数组作为初始值放入方法中。结果将只是该数组的副本。
        猜你喜欢
        • 1970-01-01
        • 2021-06-24
        • 2017-10-11
        • 1970-01-01
        • 2016-08-02
        • 2014-09-07
        • 2021-06-07
        • 1970-01-01
        • 2017-07-07
        相关资源
        最近更新 更多