将 LinkedHashSet 转换为 ArrayList 或仅使用 ArrayList

TTa*_*Ta4 2 java arraylist linkedhashset

考虑以下代码:

final Set<String> allPaths = new HashSet<String>();
for (final String path: paths) {
        allPaths.add(path);
}
final MyData d = new MyData(new ArrayList<String>(allPaths));
Run Code Online (Sandbox Code Playgroud)

MyData是一些我不应该碰的类。它应该得到一个ArrayList作为参数。在这一天之前,我们是这样使用的,因为我们不关心顺序,这就是我们使用的原因Set(所以不会有重复)。但是现在,我想保持元素的顺序,所以经过一些研究,我发现我可以使用数据结构LinkedHashSet 来做到这一点。所以我做了:

final LinkedHashSet<String> allPaths = new LinkedHashSet<String>();
for (final String path: paths) {
        allPaths .add(path);
}
final MyData d = new MyData(new ArrayList<String>(allPaths));
Run Code Online (Sandbox Code Playgroud)

问题是,我不确定如何转换LinkedHashSetArrayList. 另外,我想使用ArrayList而不是LinkedHashSet这样我就不必转换它,但我必须遍历数组 ( O(n))。

我应该使用什么好的、干净和有效的方式?

Dan*_* B. 6

只需使用该public boolean addAll(Collection<? extends E> c)方法,在 arrayList 上,它接受 any Collection

你有你的LinkedHashSet

final LinkedHashSet<String> allPaths = new LinkedHashSet<String>();
for (final String path: paths) {
        allPaths .add(path);
}
Run Code Online (Sandbox Code Playgroud)

然后做(即使mylist不为空,您也可以使用它):

List<String> myList = new ArrayList<>();
mylist.addAll(allPaths);
Run Code Online (Sandbox Code Playgroud)

或者甚至更简单的方法:

List<String> myList = new ArrayList<>(allPaths);
Run Code Online (Sandbox Code Playgroud)