将 LinkedHashSet 转换为 ArrayList 或仅使用 ArrayList

Converting LinkedHashSet to ArrayList or just using ArrayList

考虑以下代码:

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

MyData有些class我不该碰的。它应该得到一个 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));

问题是,我不确定如何将 LinkedHashSet 转换为 ArrayList。另外,我想过使用 ArrayList 而不是 LinkedHashSet 所以我不必转换它,但我必须遍历数组 (O(n)).

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

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

你有你的 LinkedHashSet:

final LinkedHashSet<String> allPaths = new LinkedHashSet<String>();
for (final String path: paths) {
        allPaths .add(path);
}

然后执行(即使 mylist 不为空也可以使用它):

List<String> myList = new ArrayList<>();
mylist.addAll(allPaths);

或者更简单的方法:

List<String> myList = new ArrayList<>(allPaths);

为什么不直接将 paths 转换为那样的 LinkedHashSet(假设 paths 是一个集合?

final MyData d = new MyData(new ArrayList<>(new LinkedHashSet<>(paths)));

如果paths是一个数组,你可以在上面的转换中使用Arrays.asList(paths)

@TTaJTa4 you can use the code below as an example. Both ways are fine.



import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.Set;

public class ConvertLinkedHashSetToArrayList
{

  public static void main(String[] args)
  {
    Set<String> testStrings = new LinkedHashSet<>();
    testStrings.add("String 1");
    testStrings.add("String 2");
    testStrings.add("String 3");
    testStrings.add("String 4");
    testStrings.add("String 5");

    System.out.println("** Printing LinkedHashSet: " + testStrings);
    ArrayList<String> linkedHashSetToArrayList1 = new ArrayList<>(testStrings);
    System.out.println("** Printing linkedHashSetToArrayList1:" + 
    linkedHashSetToArrayList1);

    ArrayList<String> linkedHashSetToArrayList2 = new ArrayList<>();
    linkedHashSetToArrayList2.addAll(testStrings);
    System.out.println("** Printing linkedHashSetToArrayList2:" + 
    linkedHashSetToArrayList2);
  }
}

结果如下:

** Printing LinkedHashSet: [String 1, String 2, String 3, String 4, String 5]
** Printing linkedHashSetToArrayList1:[String 1, String 2, String 3, String 4, String 5]
** Printing linkedHashSetToArrayList2:[String 1, String 2, String 3, String 4, String 5]

关注 GitHub link 以获得完整的 java 项目: GitHub example

如果paths是一个集合你可以得到一个没有重复的数组列表:

ArrayList<String> p = paths.stream().distinct().collect(Collectors.toCollection(ArrayList::new));

如果paths是一个数组:

ArrayList<String> p = Stream.of(paths).distinct().collect(Collectors.toCollection(ArrayList::new));