項(xiàng)目中的問(wèn)題:ArrayList中可能存在重復(fù)值,需要將重復(fù)值剔除掉.剛開(kāi)始的想法是做一個(gè)嵌套循環(huán),將當(dāng)前值與之后的所有值比較,如果重復(fù)則將后面重復(fù)的值刪除掉.但是運(yùn)行后發(fā)現(xiàn),由于循環(huán)中刪除值后會(huì)影響到數(shù)組的索引值,所以會(huì)出現(xiàn)漏值和跳值的現(xiàn)象.
仔細(xì)想想后,覺(jué)得應(yīng)該反向遍歷數(shù)組,這樣從后面刪除元素后不會(huì)影響到前面元素的索引值,可以避免前面的問(wèn)題:
// 刪除ArrayList中重復(fù)元素

public static void removeDuplicate(List list)
{

for (int i = 0; i < list.size() - 1; i++)
{

for (int j = list.size() - 1; j > i; j--)
{

if (list.get(j).equals(list.get(i)))
{
list.remove(j);
}
}
}
System.out.println(list);
}
可是這樣做,總覺(jué)得嵌套循環(huán)的效率很低,比較ArrayList大了以后的執(zhí)行時(shí)間.又想到HashSet中是不能有又重復(fù)值的,要是能用HashSet來(lái)過(guò)濾該多好.查了下JDK的文檔,發(fā)現(xiàn)HashSet有一個(gè)構(gòu)造函數(shù) public HashSet(Collection c),到網(wǎng)上一查,果然有這樣做的例子(http://blog.csdn.net/doodoofish/archive/2004/05/07/17922.aspx):
// 刪除ArrayList中重復(fù)元素

public static void removeDuplicate(List list)
{
HashSet h = new HashSet(list);
list.clear();
list.addAll(h);
System.out.println(list);
}

//刪除ArrayList中重復(fù)元素,保持順序

public static void removeDuplicateWithOrder(List list)
{
Set set = new HashSet();
List newList = new ArrayList();

for (Iterator iter = list.iterator(); iter.hasNext();)
{
Object element = iter.next();
if (set.add(element))
newList.add(element);
}
list.clear();
list.addAll(newList);
System.out.println("remove duplicate" + list);
}
可以看出:向Set中即使插入重復(fù)值,也只會(huì)保留個(gè)實(shí)例.
不過(guò),運(yùn)行后發(fā)現(xiàn)使用循環(huán)的方法好像并不比Set過(guò)濾慢多少(1000條記錄,10~20毫秒),而且某些情況下Set過(guò)濾甚至比循環(huán)還慢(最慢一次是 311毫秒:60毫秒)
posted on 2005-08-18 11:38
ZhuJun 閱讀(2003)
評(píng)論(1) 編輯 收藏 所屬分類:
開(kāi)發(fā)手記