Java混合变量String [],String只包含一个字符串数组

时间:2013-09-17 21:20:45

标签: java arrays string

假设:

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 个答案:

答案 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...参数的元素。

接受StringString[]的唯一方法是“无类型”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();
}