📅  最后修改于: 2023-12-03 14:51:47.022000             🧑  作者: Mango
LinkedHashSet 是 Java 中的一种特殊集合,它继承了 HashSet 并且保留了元素顺序。它允许快速访问集合中的元素,并将元素按照插入顺序进行迭代。
但如果我们想要随机访问并获取集合中的元素呢?本篇文章就给出了一些方法,以帮助你从 LinkedHashSet 中获取随机元素。
我们可以将 LinkedHashSet 中的元素转换为数组,并使用随机索引访问数组。
LinkedHashSet<String> set = new LinkedHashSet<>();
// 添加元素到集合中
String[] array = set.toArray(new String[0]);
String randomElement = array[new Random().nextInt(array.length)];
这种方法简单易懂,但如果 LinkedHashSet 中的元素非常多,转换为数组也会花费大量时间和内存。
Java 中的 ListIterator 实现了 Iterator 接口,并添加了防向前遍历的能力。
在 LinkedHashSet 中,我们可以使用 listIterator() 方法返回一个 ListIterator 实例。由于 LinkedHashSet 继承自 HashSet,因此元素的顺序在 HashSet 内部是不确定的。
我们可以在迭代器中使用 next() 方法跳到一个随机索引。然后使用 next() 方法跳过其他元素,最终得到一个随机元素。
LinkedHashSet<String> set = new LinkedHashSet<>();
// 添加元素到集合中
ListIterator<String> iterator = new ArrayList<>(set).listIterator(new Random().nextInt(set.size()));
String randomElement = iterator.next();
这种方法比第一种方法内存占用更少,并具有相同的时间复杂度。
Java 8 引入了 Stream API,提供了一种使用 lambda 表达式的函数式编程风格。
我们可以使用 Stream API 从 LinkedHashSet 中获取随机元素。
LinkedHashSet<String> set = new LinkedHashSet<>();
// 添加元素到集合中
String randomElement = set.stream().skip(new Random().nextInt(set.size())).findFirst().get();
这种方法使用 Stream 的 skip() 和 findFirst() 方法跳过前面的 n 个元素,并返回剩下的第一个元素。但对于大型集合,skip() 方法可能会花费大量的时间。
如果 LinkedHashSet 的大小很小,这种方法比其他方法更加优雅。但对于大型集合,第二种方法是最合适的。