0 0

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

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

5个答案 按时间排序 按投票排序

0 0

采纳的答案

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

	@Override
	public boolean add(E o) {
		if (super.add(o)) {
			list.add(o);
			return true;
		} else
			return false;
	}

	@Override
	public boolean remove(Object o) {
		if (super.remove(o)) {
			list.remove(o);
			return true;
		} else
			return false;
	}

	@Override
	public void clear() {
		super.clear();
		list.clear();
	}

}

自己抉择吧

2012年3月20日 11:09
0 0

set是一个集合,集合就是一堆东西的意思,set中的东西是不重复的,即使你放了两个一样的东西,set只会保留一个;set是不能随机存取的,而且set的顺序是不固定的,读的顺序跟你存的顺序也是不同的,这是由set的性质决定的。而list是链表的意思,存取的顺序是固定的,所以可以随机读。如果要随机存取,那就用list吧。

2012年3月20日 09:42
0 0

以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 的源码,也不要被源码吓到,很简单的,我都看懂了

2012年3月20日 09:01
0 0

List是一个集合呀,里面有很多元素,怎么知道你去哪个呀?所以要遍历呀 


例如  List  list = new ArrayList();
           list.set...
           list.set.....

       for(int i =0;i<list.size();i++){
          System.out.println(list[i]);
}

2012年3月20日 08:39
0 0

你直接佛纳甘set取出来循环放进list里面不就行了吗?

2012年3月20日 08:35

相关推荐

    Java集合排序及java集合类详解(Collection、List、Map、Set

    `Collection`提供了一组通用的方法来处理元素集合。 #### 1.2.1 常用方法 - `add(E e)`:向集合中添加一个元素。 - `remove(Object o)`:从集合中移除指定元素。 - `size()`:返回集合中元素的数量。 - `isEmpty()...

    Java集合Collection、List、Set、Map使用详解

    **为什么要使用容器?** - **动态调整大小**:容器可以根据需要动态扩展或缩小,不像数组那样需要预先指定大小。 - **消除重复元素**:某些类型的容器(如`Set`)能够确保其中的元素不重复。 - **键值对映射**:`Map...

    map,list,set,stack,queue,vector等区别和特点1

    本文将深入探讨标题和描述中提到的一些关键集合类型,包括Map、Set、List、Queue、Stack以及它们的特点和用法。 首先,Collection接口是所有集合类型的父接口,它分为两个主要子接口:List和Set。List接口用于存储...

    【List、Set、数据结构、Collections】.pdf

    可变参数的格式是在方法声明中使用省略号“...”来表示方法可以接受任意数量的参数,这些参数被视为一个数组。在方法体内,可以像操作数组一样访问可变参数。 集合工具类提供了许多静态方法来操作集合,如反转、洗...

    具有随机图片背景的EditBox控件

    在Android开发中,创建一个具有随机图片背景的EditBox控件可以为用户界面带来独特的视觉效果,提升用户体验。本文将详细讲解如何实现这样一个功能,并探讨其背后涉及的技术点。 首先,我们要了解EditBox(EditText...

    Java集合框架[汇编].pdf

    它没有索引的概念,只提供元素的添加、删除和检查是否存在的方法。 4. **Iterator接口** Iterator接口是遍历集合的统一方式,提供hasNext()和next()方法,用于依次访问集合中的元素,而无需知道底层数据结构。 5....

    第8章 集合类与泛型程序设计

    Iterator接口用于遍历集合中的元素,提供了`next()`方法获取下一个元素,以及`hasNext()`方法判断是否还有更多元素,同时提供了`remove()`方法删除当前元素。 8.6 Map及HashMap接口: Map接口不同于Collection,它...

    java数据结构 ArrayList、Stack、Map

    ArrayList提供了许多方法,如`add()`用于添加元素,`get()`用于获取元素,`set()`用于修改元素,以及`size()`用于获取元素数量。 **Stack** 是另一个重要的数据结构,它是ArrayList的一个子类,实现了Stack接口。...

    python 统计一个列表当中的每一个元素出现了多少次的方法

    这种方法利用了Python的字典数据结构,遍历列表的同时,如果元素不在字典中,则将其作为键,值为1;如果已存在,就增加其对应的值。 ```python List = [1,2,2,2,2,3,3,3,4,4,4,4] a = {} for i in List: if List....

    Java平台提供了一个全新的集合框架.doc

    接下来是抽象类,如AbstractCollection提供了Collection接口的默认实现,但像iterator()和size()这些方法需要子类具体实现。AbstractList和AbstractSet分别提供了List和Set接口的一部分默认实现,使得自定义集合类...

    新东方JAVA课程PPT课件(2)

    `abstract`关键字用于声明抽象类和抽象方法,抽象类不能被实例化,只能作为其他类的父类,而抽象方法没有具体实现,必须由其子类覆盖。 文件操作在Java中通常涉及`java.io`包中的类,如File、FileInputStream和...

    Java容器类的深入理解

    Java容器类是Java编程中非常重要的一部分,它们为数据存储提供了丰富的结构和操作。本文主要关注的是Java中的两种主要容器类型:Collection和Map,以及它们的一些具体实现,如List接口下的ArrayList、LinkedList和...

    Java应用程序-习题-第8章.doc

    根据 Java 集合框架中的定义,Java Set 集合中的元素是不可以重复的,Set 集合中的每个元素都是唯一的。 4. Java List 集合与 Java 数组相似,Java List 集合的长度也是固定的。错误 Java List 集合与 Java 数组...

    Java集合详解,详细讲解java的集合类

    同时,Collection接口提供了iterator()方法,使得可以通过迭代器遍历集合中的每个元素。Java SDK并未提供直接继承自Collection的类,而是通过其子接口如List和Set来实现具体的集合类。 List接口是Collection的一...

    学习笔记 java\CoreJava笔记\CoreJava_day11

    List接口中的方法如`add()`、`add(int index, E element)`、`addAll()`、`clear()`、`equals()`、`get()`、`hashCode()`、`remove()`、`removeAll()`、`retainAll()`和`set()`等,提供了对列表的常用操作。...

    java集合详解.pdf

    迭代器是遍历集合元素的主要方式,通过调用iterator()方法获取,然后使用hasNext()和next()方法来遍历集合中的每一个元素。迭代器还支持remove()方法,可以在遍历过程中删除元素。 1.3 LIST List接口继承自...

    Javacollection全集

    值得注意的是,Collection接口没有提供`get()`方法,这意味着不能通过索引来访问元素,而是通过迭代器进行访问。 2. **Set接口**:Set接口继承自Collection,它不允许重复元素。Set接口中常用的实现类有HashSet、...

    net学习笔记及其他代码应用

    Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。 接口(interface)是抽象类的变体。在接口中,所有方法...

Global site tag (gtag.js) - Google Analytics