java list去重操作实现方式

2016-02-19 11:38 5 1 收藏

get新技能是需要付出行动的,即使看得再多也还是要动手试一试。今天图老师小编跟大家分享的是java list去重操作实现方式,一起来学习了解下吧!

【 tulaoshi.com - 编程语言 】

Java中的List是可以包含重复元素的(hash code 和equals),那么对List进行去重操作有两种方式实现:
方案一:可以通过HashSet来实现,代码如下:
代码如下:

class Student {
private String id;
private String name;
public Student(String id, String name) {
super();
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
Student other = (Student) obj;
if (id == null) {
if (other.id != null) {
return false;
}
} else if (!id.equals(other.id)) {
return false;
}
if (name == null) {
if (other.name != null) {
return false;
}
} else if (!name.equals(other.name)) {
return false;
}
return true;
}
}

必须实现hashCode和equals两个方法,一会我们会看为啥必须实现
具体的操作代码如下:
代码如下:

private static void removeListDuplicateObject() {
ListStudent list = new ArrayListStudent();
for (int i = 0; i 10; i++) {
Student student = new Student("id", "name");
list.add(student);
}
System.out.println(Arrays.toString(list.toArray()));
SetStudent set = new HashSetStudent();
set.addAll(list);
System.out.println(Arrays.toString(set.toArray()));
list.removeAll(list);
set.removeAll(set);
System.out.println(Arrays.toString(list.toArray()));
System.out.println(Arrays.toString(set.toArray()));
}

调用代码:
代码如下:

public static void main(String[] args) {
removeListDuplicateObject();
}

利用HashSet进行去重操作,为啥必须覆盖hashCode和equals两个方法呢?
我们查看HashSet的add操作源码如下:
代码如下:

public boolean add(E e) {
return map.put(e, PRESENT)==null;
}

调用了HashMap进行操作的,我们看HashMap的put操作:
代码如下:

public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
for (EntryK,V e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash, key, value, i);
return null;
}

需要注意的是:
代码如下:

if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
......
}

也就是说hash code相等且equals(==)。
复杂度:一边遍历即可,O(n)
方案二:直接遍历一遍List进行通过contains和add操作实现
代码如下:
代码如下:

private static void removeListDuplicateObjectByList() {
ListStudent list = new ArrayListStudent();
for (int i = 0; i 10; i++) {
Student student = new Student("id", "name");
list.add(student);
}
System.out.println(Arrays.toString(list.toArray()));
ListStudent listUniq = new ArrayListStudent();
for (Student student : list) {
if (!listUniq.contains(student)) {
listUniq.add(student);
}
}
System.out.println(Arrays.toString(listUniq.toArray()));
list.removeAll(list);
listUniq.removeAll(listUniq);
System.out.println(Arrays.toString(list.toArray()));
System.out.println(Arrays.toString(listUniq.toArray()));
}

其他等同上面。
复杂度:
一边遍历,同时调用了contains方法,我们查看源码如下:
代码如下:

public boolean contains(Object o) {
return indexOf(o) = 0;
}
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}

可以看到又对新的list做了一次遍历操作。也就是1+2+....+n这样复杂度为O(n*n)
结论:
方案一效率高,即采用HashSet的方式进行去重操作

来源:http://www.tulaoshi.com/n/20160219/1598037.html

延伸阅读
标签: excel
Excel控制重算的方式 计算是指进行公式运算,然后在包含此公式的单元格中以数值形式显示出运算结果的过程。在一般情况下,当在单元格中输入一个公式时,如果相关的单元格已经准备好数据,则Excel将自动计算出结果,并显示在单元格中;如果相关的单元格没有准备好数据,则Excel将在单元格中显示0。 实际上,可以将工作表设定为人工重算...
标签: 办公软件
    计算是指进行公式运算,然后在包含此公式的单元格中以数值形式显示出运算结果的过程。在一般情况下,当在单元格中输入一个公式时,如果相关的单元格已经准备好数据,则Excel将自动计算出结果,并显示在单元格中;如果相关的单元格没有准备好数据,则Excel将在单元格中显示“0”。     ...
列表控件可以看作是功能增强的ListBox,它提供了四种风格,而且可以同时显示一列的多中属性值。MFC中使用CListCtrl类来封装列表控件的各种操作。通过调用 BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );创建一个窗口,dwStyle中可以使用以下一些列表控件的专用风格: LVS_ICON LVS_SMALLICON LVS_LIST L...
标签: Web开发
代码如下: $.ajax({ url : "user!findUserList.action", type : "post", success: function(data){ var jsonObj=eval("("+data+")"); $.each(jsonObj, function (i, item) { jQuery("#userList").append("option value="+ item.userId+""+ item.userRealName+"/option"); }); }, error: function(text) {} }); 代码如下: pub...
酷狗音乐怎么去重?   第一步、打开酷狗,然后点击在本地的歌曲列表的空白的地方点击鼠标的右键,选择其中的歌曲体检工具功能。 第二步、在弹出的歌曲体检工具中选择歌曲去重功能,然后点击开始检查。 第三步、之后在下方就会出现重复的音乐文件的信息,可以逐一的进行筛选删除,保留自己喜欢的版本。 第四步...

经验教程

161

收藏

87
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部