我有一个返回原始矢量的函数。我知道向量中的所有元素都是字符串,但代码仍然是出于遗留原因。我想从这些数据中得到一个arraylist。
一种天真的方法是迭代向量并将元素添加到列表中。是否有任何简短的方法可以防止循环。或者可以是实现此目的的直接功能。
编辑:
示例:
Vector f1() {} //f1 returns raw vector
我想实现以下目标:
List<String> l = new ArrayList<String>();
Vector vec = f1();
for(Object obj: vec) {
l.add((String) obj);
}
注意:我没有检查上面的代码是否编译。请将其视为伪代码
答案 0 :(得分:7)
如果你100%确定Vector只包含字符串,最简单的方法是:
List<String> list = new ArrayList<>(vector);
请注意,即使Vector包含其他类型的对象,这也将编译并运行正常。但是这个:
list.get(i);
如果第i个元素不是String,将抛出ClassCastException
。
由于您有一个原始Vector,您将收到警告。如果你想摆脱它们,你可以使用:
@SuppressWarnings(value = {"unchecked", "rawtypes"})
public static List<String> rawVectorToList(Vector v) {
return new ArrayList<>(v);
}
快速检测转换问题的另一种方法是手动复制数组(复制构造函数在引擎盖下执行的操作):
Vector v = ...;
String[] elements = Arrays.copyOf(v.toArray(), v.size(), String[].class);
List<String> list = Arrays.asList(elements);
或者如果您需要列表是可变的:
List<String> list = new ArrayList<> (Arrays.asList(elements));
这样做的好处是可以在复制时检查类型。