将 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));
考虑以下代码:
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));