日期:2014-05-20  浏览次数:20819 次

Set是不是没有remove方法吗?
下面这个程序我分别用list,queue来删除元素,并且用isEmpty方法,但是set中不支持remove方法,只好和跌代器了。是真的set中没有remove方法吗?

import java.util.*;

public class Test
{
public static void main(String[] args)
{
Queue<GregorianCalendar> list = new PriorityQueue<GregorianCalendar>();
list.add(new GregorianCalendar(1999, Calendar.DECEMBER, 9));
list.add(new GregorianCalendar(2000, Calendar.APRIL, 10));
list.add(new GregorianCalendar(1900, Calendar.MARCH, 3));
list.add(new GregorianCalendar(1995, Calendar.MAY, 12));

while( !list.isEmpty())
{
System.out.println(list.remove().get(Calendar.YEAR));
}
System.out.println();

List<GregorianCalendar> list_1 = new ArrayList<GregorianCalendar>();
list_1.add(new GregorianCalendar(1999, Calendar.DECEMBER, 9));
list_1.add(new GregorianCalendar(2000, Calendar.APRIL, 10));
list_1.add(new GregorianCalendar(1900, Calendar.MARCH, 3));
list_1.add(new GregorianCalendar(1995, Calendar.MAY, 12));

while( !list_1.isEmpty())
{
System.out.println(list_1.remove(0).get(Calendar.YEAR));
}
System.out.println();

Set<GregorianCalendar> list_2 = new TreeSet<GregorianCalendar>();
list_2.add(new GregorianCalendar(1999, Calendar.DECEMBER, 9));
list_2.add(new GregorianCalendar(2000, Calendar.APRIL, 10));
list_2.add(new GregorianCalendar(1900, Calendar.MARCH, 3));
list_2.add(new GregorianCalendar(1995, Calendar.MAY, 12));

Iterator<GregorianCalendar> it = list_2.iterator();    
               while(it.hasNext())
                {
                    System.out.println(it.next().get(Calendar.YEAR));
                    it.remove();
}

// //如果一定要用isEmpty()方法怎样做到删除,
// while( !list_2.isEmpty())
// {
//
// System.out.println(list_2.remove().get(Calendar.YEAR));
// }
        

}
}


------解决方案--------------------

remove
boolean remove(Object o)如果 set 中存在指定的元素,则将其移除(可选操作)。更确切地讲,如果此 set 中包含满足 (o==null ? e==null : o.equals(e)) 的元素 e,则移除它。如果此 set 包含指定的元素(或者此 set 由于调用而发生更改),则返回 true(一旦调用返回,则此 set 不再包含指定的元素)。 

指定者:
接口 Collection<E> 中的 remove
参数:
o - 从 set 中移除的对象(如果存在) 
返回:
如果此 set 包含指定的对象,则返回 true 
抛出: 
ClassCastException - 如果指定元素的类型与此 set 不兼容(可选) 
NullPointerException - 如果指定的元素为 null,并且此 set 不允许 null 元素(可选) 
UnsupportedOperationException - 如果此 set 不支持 remove 操作

------解决方案--------------------
楼上的就是API,楼主参看
------解决方案--------------------
谁告诉你set不支持remove的?拉他出去切JJ
------解决方案--------------------
Set<String> set = new HashSet<String>();
set.add("a");
set.add("b");
set.add("c");
set.add("d");
System.out.println(set);
set.remove("c");
System.out.println(set);


------解决方案--------------------
引用:
Set中的remove的参数类型为Object,但是如果不用跌代器遍历来删除,似乎不能成功?因为只有用跌代器遍历取词再放到remove中做参数,对吗?我本意是想问如果不能跌代器能不能做到遍历删除,就像我的程序中的Queue与List一样。


Quote: 引用:

Set<String> set = new HashSet<String>();
set.add("a");
set.add("b");
set.add("c");
set.add("d");
System.out.println(set);
set.remove("c");
System.out.println(set);



为什么不能成功?

------解决方案--------------------
set如果不涉及到 hash算法,肯定是可以删除的,楼主关于有没有方法,看api不就 o了?
另外,一般对应hash算法的集合,如果修改hash值,那就移除不了了.