【问题标题】:What is the best way to convert a raw vector to type safe list(Arraylist)将原始向量转换为类型安全列表(Arraylist)的最佳方法是什么
【发布时间】:2014-02-03 08:55:23
【问题描述】:

我有一个返回原始向量的函数。我知道向量中的所有元素都是字符串,但由于遗留原因,代码仍然存在。我想从这个数据中得到一个数组列表。

一种天真的方法是迭代向量并将元素添加到列表中。是否有任何简短的方法可以防止循环。或者可能是启用此功能的直接功能。

编辑:

例子:

Vector f1() {}  //f1 returns raw vector

我想实现以下目标:

List<String> l = new ArrayList<String>();
Vector vec = f1();
for(Object obj: vec) {
    l.add((String) obj);
}

注意:我没有检查上面的代码是否编译。请将其视为伪代码

【问题讨论】:

  • 您需要指定所需的输入和输出。示例:输入Object[],输出List&lt;String&gt;
  • @UmNyobe 请查看编辑。

标签: java generics vector arraylist


【解决方案1】:

如果你 100% 确定 Vector 只包含字符串,最简单的方法是:

List<String> list = new ArrayList<>(vector);

请注意,即使您的 Vector 包含其他类型的对象,它也可以正常编译和运行。然而这个:

list.get(i);

如果第 i 个元素不是字符串,将抛出 ClassCastException

因为你有一个原始向量,你会收到警告。如果你想摆脱它们,你可以使用:

@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));

这有利于在复制时检查类型。

【讨论】:

  • 它会引发警告。我想摆脱警告。即使我们可以做List&lt;String&gt; list = new ArrayList&lt;String&gt;(vec);,但这也会引发警告。
  • 定时炸弹+1。你不是你看起来的 assylias(或者我以前用过吗?)
  • @Bohemian 是的,我想你已经做到了!不过还是很有趣!
  • 它会引发警告,因为您正在做的事情是不安全的,尤其是相关的,因为爆炸可能发生在代码中很远的地方,并且在很长一段时间之后,从制作演员表开始。
  • @Bohemian 我可以假设编写循环是唯一的好方法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-24
  • 1970-01-01
相关资源
最近更新 更多