項目中的問題:ArrayList中可能存在重復值,需要將重復值剔除掉.剛開始的想法是做一個嵌套循環,將當前值與之后的所有值比較,如果重復則將后面重復的值刪除掉.但是運行后發現,由于循環中刪除值后會影響到數組的索引值,所以會出現漏值和跳值的現象.
仔細想想后,覺得應該反向遍歷數組,這樣從后面刪除元素后不會影響到前面元素的索引值,可以避免前面的問題:
// 刪除ArrayList中重復元素

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);
}
可是這樣做,總覺得嵌套循環的效率很低,比較ArrayList大了以后的執行時間.又想到HashSet中是不能有又重復值的,要是能用HashSet來過濾該多好.查了下JDK的文檔,發現HashSet有一個構造函數 public HashSet(Collection c),到網上一查,果然有這樣做的例子(http://blog.csdn.net/doodoofish/archive/2004/05/07/17922.aspx):
// 刪除ArrayList中重復元素

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

//刪除ArrayList中重復元素,保持順序

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中即使插入重復值,也只會保留個實例.
不過,運行后發現使用循環的方法好像并不比Set過濾慢多少(1000條記錄,10~20毫秒),而且某些情況下Set過濾甚至比循環還慢(最慢一次是 311毫秒:60毫秒)
posted on 2005-08-18 11:38
ZhuJun 閱讀(2003)
評論(1) 編輯 收藏 所屬分類:
開發手記