假设:
String s0 = "01234";
String[] S1 = {"jkl","abc","xyz"};
String[] S2 = {"OPQ","ghi","STU"};
String s3 = "56789";
get_AllStrings(s3, S1, S2, s0);
返回的String []必须是:
String[] NewArray = {"56789","OPQ","ghi","STU","01234"}
我想获得这个字符串只有一个字符串数组... 这是我的方法:
public String[] get_AllStrings(String... argString) { //Only String or String[]
int TheSize = 0;
for (int i = 0; i<argString.length; i++) {
if(argString[i]!= null && argString[i].getClass().isArray()) {
String[] OneArray = (String [])argString[i];
TheSize += OneArray.length;
} else {
TheSize += 1;
}
}
String[] NewArray = new String[TheSize];
int ThePos = 0;
for (int i = 0; i<argString.length; i++) {
if(argString[i]!= null && argString[i].getClass().isArray()) {
String[] OneArray = argString[i];
System.arraycopy(OneArray, 0, NewArray, ThePos, OneArray.length);
ThePos += OneArray.length;
} else {
String[] OneArray = {argString[i]};
System.arraycopy(OneArray, 0, NewArray, ThePos, 1);
ThePos += OneArray.length;
}
}
return NewArray;
}
但是,不起作用......
答案 0 :(得分:2)
您要做的是使用ArrayList而不是数组。
public static String[] getAllStrings(Object ... argString) {
ArrayList<String> list = new ArrayList<String>();
for (Object stringOrArray : argString) {
if (stringOrArray instanceof String)
list.add((String) stringOrArray);
else {
String[] strings = (String) stringOrArray;
list.addAll(Arrays.asList(strings));
}
}
return list.toArray(new String[list.size()]);
}
答案 1 :(得分:0)
我改变了你的代码并得到了这个:
public static String[] get_AllStrings(Object... argString) {
ArrayList<String> strings = new ArrayList<String>();
for (int i = 0; i<argString.length; i++) {
if(argString[i]!= null && argString[i].getClass().isArray()) {
String[] OneArray = (String [])argString[i];
for(String str : OneArray)
strings.add(str);
} else {
strings.add((String)argString[i]);
}
}
return (String[])strings.toArray();
}
我无法使用您的方法签名接受String和String [],但是对Object的更改......就可以了。您可以使用ArrayList直接创建数组,而不是循环遍历所有内容。
答案 2 :(得分:0)
不幸的是,你在这里遇到了Java的类型系统。
String和String []不是子类型。 所以变量或数组只能容纳一个或另一个。 使用对象,由@Johan Henriksson完成,抛弃了编译器的任何类型安全保证,因为任何对象都可以放在数组中。这是没关系的,如果你有一些你只会拥有字符串的服务员,并且你需要在退出集合时强制转换为字符串。
我不确定你在这里想要实现的目标 所以我不确定如何解决这个问题。
如果您只想要某种集合中所有来源的所有字符串,我会使用一个列表 然而,目前还不清楚你从哪里得到这些字符串和字符串数组。
答案 3 :(得分:0)
您无法将String[]
传递给varargs String...
参数的元素。
接受String
或String[]
的唯一方法是“无类型”varargs Object...
,因为Object是两者的唯一常见类型。
public static String[] get_AllStrings(Object... args) {
ArrayList<String> result = new ArrayList<String>();
for (Object o : args) {
if (o instanceof String) {
result.add((String)o);
} else if (o instanceof String[]) {
result.addAll(Arrays.asList((String[])o));
} else {
throw new IllegalArgumentException();
}
}
return (String[])result.toArray();
}