我有一个对象数组。每个数组元素的内容可以是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.....
}
请帮忙。 感谢名单
答案 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;
}
我没有测试它,但我希望能给你这个想法