📌  相关文章
📜  如何从Java中的 LinkedHashSet 中获取随机元素?(1)

📅  最后修改于: 2023-12-03 14:51:47.022000             🧑  作者: Mango

从 Java 中的 LinkedHashSet 中获取随机元素

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

这种方法比第一种方法内存占用更少,并具有相同的时间复杂度。

方法三:使用 Stream(Java 8+)

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 的大小很小,这种方法比其他方法更加优雅。但对于大型集合,第二种方法是最合适的。