为什么Set及子类中没有提供随机取元素的方法

问题描述

在List中提供了get等方法来实现随机取在容器中的元素,但是,为什么在Set中没有提供呢,如果要在Set及子类中实现随机读取元素,该怎么操作,不可能自己去遍历或将Set存到List中去吧。

解决方案

1.可以用Set的一下两个方法获取可以随机访问的数组:引用 Object[] toArray() 返回一个包含 set 中所有元素的数组。 <T> T[] toArray(T[] a) 返回一个包含 set 中所有元素的数组;返回数组的运行时类型是指定数组的类型。 2.可以继承HashSet,使用复合数据结构:import java.util.ArrayList;import java.util.HashSet;public class ArraySet<E> extends HashSet<E> {private static final long serialVersionUID = -7548294595221509577L;private ArrayList<E> list = new ArrayList<E>();/** * @param index * @return * @see java.util.ArrayList#get(int) */public E get(int index) {return list.get(index);}@Overridepublic boolean add(E o) {if (super.add(o)) {list.add(o);return true;} elsereturn false;}@Overridepublic boolean remove(Object o) {if (super.remove(o)) {list.remove(o);return true;} elsereturn false;}@Overridepublic void clear() {super.clear();list.clear();}}自己抉择吧
解决方案二:
set是一个集合,集合就是一堆东西的意思,set中的东西是不重复的,即使你放了两个一样的东西,set只会保留一个;set是不能随机存取的,而且set的顺序是不固定的,读的顺序跟你存的顺序也是不同的,这是由set的性质决定的。而list是链表的意思,存取的顺序是固定的,所以可以随机读。如果要随机存取,那就用list吧。
解决方案三:
以HashSet为例,源码中有这么几行代码 private transient HashMap<E,Object> map; // Dummy value to associate with an Object in the backing Map private static final Object PRESENT = new Object(); /** * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has * default initial capacity (16) and load factor (0.75). */ public HashSet() {map = new HashMap<E,Object>(); } public boolean add(E e) {return map.put(e, PRESENT)==null; }可以明显看出,HashSet的本质是一个Map,Map的key就是HashSet加入的值,Map的value都是PRESENT(Object的实例)。Map是怎么存储的?HashMap是随机存储的,只能通过key来get,没有顺序遍历。而List的本质是一个数组,当然可以通过get(index)获取如果还不是很清楚,建议看看List ArrayList LinkedList Set HashSet TreeSet 的源码,也不要被源码吓到,很简单的,我都看懂了
解决方案四:
List是一个集合呀,里面有很多元素,怎么知道你去哪个呀?所以要遍历呀 例如 List list = new ArrayList(); list.set... list.set..... for(int i =0;i<list.size();i++){ System.out.println(list[i]);}
解决方案五:
你直接佛纳甘set取出来循环放进list里面不就行了吗?

时间: 2024-12-22 00:55:52

为什么Set及子类中没有提供随机取元素的方法的相关文章

php随机取mysql记录方法小结_php技巧

本文实例总结了php随机取mysql记录方法.分享给大家供大家参考.具体分析如下: 在php中要随机取mysql记录我们可以直接使用mysql_query来执行mysql中的select rand函数获取的数据并读出来,这里就来给大家简单介绍一下. 方法一,代码如下: 复制代码 代码如下: select * from tablename order by rand() limit 1 把 limit 后面的数值改为你想随机抽取的条数,这里只取一条. 方法二,代码如下: 复制代码 代码如下: $q

去除arraylist容器中的相同的对象元素的方法_Android

<span class="keyword" style="background-color: rgb(250, 250, 250); font-size: 1em; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace;">boolean</span><span style="

去除arraylist容器中的相同的对象元素的方法

<span class="keyword" style="background-color: rgb(250, 250, 250); font-size: 1em; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace;">boolean</span><span style="

PL/SQL小技巧一个:在子类中怎么调用父类被重载的方法

技巧 在C++和Java中,这是非常容易实现的C++是:父类名::被重载的方法(参数表), 比如:      ancestorclass::name({arguments});而在Java中,可以用super代替父类,如这样实现      Super.name({arguments}); 而在Oracle 9i Release2中都没实现这样的功能,当然我们可以用其它办法来实现这样的功能. 父类对象类型Create or Replace Type parent as object (      

MySQL中rand函数随机取数据介绍

 代码如下 复制代码 SELECT * FROM table_name ORDER BY rand() LIMIT 5; rand在手册里是这么说的: RAND() RAND(N) 返回在范围0到1.0内的随机浮点值.如果一个整数参数N被指定,它被用作种子值.  代码如下 复制代码 mysql> select RAND();         -> 0.5925 mysql> select RAND(20);         -> 0.1811 mysql> select RA

关于GridView中各种列后台取值的方法

1.GridView中默认的是BoundField在后台可用GridView1.Rows[0].Cells[0]来取值. 2.如果是其他列如HyperLinkField,ButtonField,CheckBoxField则要在后台进行转化. 转化方法如下: ((HyperLink)GridView1.Rows[RowIndex].Cells[0].Controls[0]).Text 对应的Field转化为相应的类型,简单的方法就是Field的类型名如ButtonField去掉Field就OK了

php随机取mysql记录方法示例

方法一:  代码如下 复制代码   select * from tablename order by rand() limit 1  把 limit 后面的数值改为你想随机抽取的条数,这里只取一条. 方法二:    代码如下 复制代码 $query= "SELECT count(*) as count FROM recommends"; .... $max_num = $row['count']; // 取记录总数 srand((double)microtime()*1000000);

php面向对象中子类中重载父类详解

因为在PHP中不能存在同名的函数,所以在同一个类中也就不能定义重名的方法.这里所说的重载是指在    子类中可以定义和父类同名的方法从而覆盖从父类中继承过来的方法. 子类中重载父类的方法  代码如下 复制代码 <?php       class Person{                                                                           public $name;                                

js实现从数组里随机获取元素

 这篇文章主要介绍了js实现从数组里随机获取元素的方法,以及个人封装的js代码分享,十分的实用,这里推荐给小伙伴们     基础知识: 复制数组: (1)循环遍历复制(不推荐)   代码如下: var arry = [1,5,9,7], new_arry = [], n = 0, len = arry.length; for(;n<len;n++){ new_arry.push(arry[n]); }   (2)concat() 方法用于连接两个或多个数组,该方法不会改变现有的数组,而仅仅会返回