您的位置:首页 > 其它

ArrayList中元素去重问题

2016-01-25 14:46 405 查看
如题所示,如果一个ArrayList中包含多个重复元素,该如何去重呢?

思路一以及实现:

声明2个ArrayList,分别为listA与listB ,listA为待去重list ,listB 保存去重之后数据 。遍历listA ,然后判断listB中是否包含各个元素,若不包含,把此元素加入到listB中。

代码实现:

辅助实体类:Student

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

package com.model.elgin.collections;

public class Student {

private String id;

private String name;

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public Student(String id,
String name) {

super();

this.id = id;

this.name = name;

}

@Override

public String toString() {

return "Student [id=" + id +
", name=" + name +
"] " ;

}

}

测试类:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

package com.model.elgin.collections;

import java.util.ArrayList;

import java.util.HashSet;

import java.util.List;

import java.util.Set;

public class TestArrayList {

public static void main(String[]
args) {

deleteRepeat1();

}

/*

* list去重1

* ArrayList元素的判断包含使用equals方法

*/

public static void deleteRepeat1(){

List<Student> listA=new ArrayList<Student>();

List<Student> listB=new ArrayList<Student>();

Student st1=new Student("1","jack");

Student st2=new Student("2","jim");

Student st3=new Student("3","lucy");

Student st4=new Student("4","lily");

Student st5=new Student("4","lily");

listA.add(st1);

listA.add(st2);

listA.add(st3);

listA.add(st4);

listA.add(st5);

for (Student student : listA) {

if(!listB.contains(student)){

listB.add(student);

}

}

System.out.println(listB);

}

}

运行之后,发现打印结果并没有满足我们的要求,即去掉listA中重复的元素,这是怎么回事呢?

这是因为在使用List的contains() 方法判断是否包含一个元素时,需要把该元素与list中的所有元素进行比较,进而来确定是否包含这个元素。而上面的Student类中,并没有具体的实现equals方法,因而在比较的时候使用了Object的equals方法,故无法正确的比较,进而导致去重失败。

修改后的Student类:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

package com.model.elgin.collections;

public class Student {

private String id;

private String name;

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public Student(String id,
String name) {

super();

this.id = id;

this.name = name;

}

@Override

public boolean equals(Object obj) {

if(!(obj
instanceof Student)){

return false;

}

Student student=(Student) obj;

if(this.getId().equals(student.getId()) &&
this.getName().equals(student.getName())){

return true;

}

return false;

}

@Override

public String toString() {

return "Student [id=" + id +
", name=" + name +
"] ";

}

}

再次运行测试类,去重成功。

思路二以及实现:

我们知道,集合Set中的元素是唯一的,那么能否利用此特性,来完成list元素的去重呢。显然是可以的。

这里我们使用HashSet ,HashSet的去重原理:

首先判断对象的hashcode值是否相同,如果相同,则再调用equals方法比较对象是否相等。如果相等,则说明元素重复,不添加到集合。

因此,使用Set的特性去重,Student类还必须重写Object 的hashcode方法。

实现代码:

Student类:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

package com.model.elgin.collections;

public class Student {

private String id;

private String name;

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public Student(String id,
String name) {

super();

this.id = id;

this.name = name;

}

@Override

public boolean equals(Object obj) {

if(!(obj
instanceof Student)){

return false;

}

Student student=(Student) obj;

if(this.getId().equals(student.getId()) &&
this.getName().equals(student.getName())){

return true;

}

return false;

}

@Override

public String toString() {

return "Student [id=" + id +
", name=" + name +
"] ";

}

@Override

public int hashCode() {

return this.id.hashCode() +
this.name.hashCode();

}

}

测试类:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

package com.model.elgin.collections;

import java.util.ArrayList;

import java.util.HashSet;

import java.util.List;

import java.util.Set;

public class TestArrayList {

public static void main(String[]
args) {

deleteRepeat2();

}

/*

* list去重2

* HashSet无序/唯一,判断包含使用hashcode、equals方法

*/

public static void deleteRepeat2(){

List<Student> listA=new ArrayList<Student>();

Set<Student> listSet=new HashSet<Student>();

Student st1=new Student("1","jack");

Student st2=new Student("2","jim");

Student st3=new Student("3","lucy");

Student st4=new Student("4","lily");

Student st5=new Student("4","lily");

listA.add(st1);

listA.add(st2);

listA.add(st3);

listA.add(st4);

listA.add(st5);

listSet.addAll(listA);

System.out.println(listSet);

}

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: