1

假设:

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

但是,不工作...

4

4 回答 4

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()]);
}
于 2013-09-17T21:34:15.107 回答
0

您不能将 a 传递String[]到可变String...参数参数的元素中。

接受其中一个String或的唯一方法String[]是“无类型”可变参数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();
}
于 2013-09-17T22:49:41.520 回答
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 直接创建数组,而不是遍历所有内容两次。

于 2013-09-17T21:29:09.657 回答
0

不幸的是,您在这里遇到了 Java 的类型系统。

String 和 String[] 不是子类型。所以一个变量或数组只能保存一个或另一个。正如@Johan Henriksson 所做的那样,使用对象会抛弃编译器的任何类型安全保证,因为任何对象都可以放入数组中。如果您有一些保证,您将只拥有字符串,这没关系,并且您需要在拉出集合时转换为字符串。

我不确定您到底想在这里实现什么所以我不确定如何解决这个问题。

如果您只想要某种集合中所有来源的所有字符串,我会使用一个列表,但不清楚您从哪里获取这些字符串和字符串数组。

于 2013-09-17T21:35:53.763 回答