รายการใน Java สามารถมีองค์ประกอบที่ซ้ำกัน (รหัสแฮชและเท่ากับ) ดังนั้นจึงมีสองวิธีในการขจัดรายการที่ซ้ำกัน:
ตัวเลือกที่ 1: สามารถใช้งานได้ผ่าน HashSet รหัสมีดังนี้:
คัดลอกรหัสรหัส ดังต่อไปนี้:
นักเรียนชั้น {
รหัสสตริงส่วนตัว;
ชื่อสตริงส่วนตัว
นักเรียนสาธารณะ (รหัสสตริง ชื่อสตริง) {
ซุปเปอร์();
this.id = ไอดี;
this.name = ชื่อ;
-
@แทนที่
สตริงสาธารณะ toString() {
กลับ "นักเรียน [id=" + id + ", name=" + ชื่อ + "]";
-
@แทนที่
hashCode int สาธารณะ () {
int ไพรม์สุดท้าย = 31;
ผลลัพธ์ int = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((ชื่อ == null) ? 0 : name.hashCode());
ส่งคืนผลลัพธ์;
-
@แทนที่
บูลีนสาธารณะเท่ากับ (Object obj) {
ถ้า (นี่ == obj) {
กลับเป็นจริง;
-
ถ้า (obj == null) {
กลับเท็จ;
-
ถ้า (getClass() != obj.getClass()) {
กลับเท็จ;
-
นักเรียนอื่น ๆ = (นักเรียน) obj;
ถ้า (id == null) {
ถ้า (other.id != null) {
กลับเท็จ;
-
} อื่นถ้า (!id.equals(other.id)) {
กลับเท็จ;
-
ถ้า (ชื่อ == null) {
ถ้า (other.name != null) {
กลับเท็จ;
-
} อื่นถ้า (!name.equals(other.name)) {
กลับเท็จ;
-
กลับเป็นจริง;
-
-
ต้องใช้สองวิธี hashCode และเท่ากับ เราจะเห็นในอีกสักครู่ว่าเหตุใดจึงต้องนำรหัสการดำเนินการเฉพาะดังต่อไปนี้:
คัดลอกรหัสรหัส ดังต่อไปนี้:
โมฆะคงที่ส่วนตัว RemoveListDuplicateObject () {
รายการ <นักเรียน> รายการ = ใหม่ ArrayList<นักเรียน>();
สำหรับ (int i = 0; i <10; i++) {
นักเรียน นักเรียน = นักเรียนใหม่ ("id", "ชื่อ");
list.add(นักเรียน);
-
System.out.println(Arrays.toString(list.toArray()));
Set<Student> set = new HashSet<Student>();
set.addAll (รายการ);
System.out.println(Arrays.toString(set.toArray()));
list.removeAll (รายการ);
set.removeAll(ชุด);
System.out.println(Arrays.toString(list.toArray()));
System.out.println(Arrays.toString(set.toArray()));
-
รหัสโทร:
คัดลอกรหัสรหัส ดังต่อไปนี้:
โมฆะคงที่สาธารณะ main (String [] args) {
RemoveListDuplicateObject();
-
เมื่อใช้ HashSet เพื่อดำเนินการขจัดข้อมูลซ้ำซ้อน ทำไมเราจึงต้องแทนที่ hashCode และวิธีเท่ากับ
ตรวจสอบซอร์สโค้ดของการดำเนินการเพิ่มของ HashSet ดังนี้:
คัดลอกรหัสรหัส ดังต่อไปนี้:
เพิ่มบูลีนสาธารณะ (E e) {
กลับ map.put (e, ปัจจุบัน) == null;
-
HashMap ถูกเรียกให้ดำเนินการ ลองดูที่การดำเนินการของ HashMap:
คัดลอกรหัสรหัส ดังต่อไปนี้:
ใส่สาธารณะ V (คีย์ K, ค่า V) {
ถ้า (คีย์ == null)
ส่งคืน putForNullKey (ค่า);
int hash = hash(key.hashCode());
int i = indexFor (แฮช, table.length);
สำหรับ (รายการ <K,V> e = table[i]; e != null; e = e.next) {
วัตถุเค;
ถ้า (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = มูลค่า;
e.recordAccess(นี้);
คืนค่าเก่า;
-
-
modCount++;
addEntry(แฮช, คีย์, ค่า, i);
กลับเป็นโมฆะ;
-
สิ่งที่ควรทราบคือ:
คัดลอกรหัสรหัส ดังต่อไปนี้:
ถ้า (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
-
-
กล่าวอีกนัยหนึ่ง รหัสแฮชจะเท่ากันและเท่ากับ(==)
ความซับซ้อน: เพียงเคลื่อนที่ไปด้านเดียว O(n)
ตัวเลือกที่ 2: สำรวจรายการโดยตรงและดำเนินการประกอบด้วยและเพิ่มโค้ดดังต่อไปนี้:
คัดลอกรหัสรหัส ดังต่อไปนี้:
โมฆะคงที่ส่วนตัว RemoveListDuplicateObjectByList () {
รายการ <นักเรียน> รายการ = ใหม่ ArrayList<นักเรียน>();
สำหรับ (int i = 0; i <10; i++) {
นักเรียน นักเรียน = นักเรียนใหม่ ("id", "ชื่อ");
list.add(นักเรียน);
-
System.out.println(Arrays.toString(list.toArray()));
รายการ <นักเรียน> listUniq = ใหม่ ArrayList<นักเรียน>();
สำหรับ (นักศึกษา นักศึกษา : รายการ) {
ถ้า (!listUniq.contains(นักเรียน)) {
listUniq.add(นักเรียน);
-
-
System.out.println(Arrays.toString(listUniq.toArray()));
list.removeAll (รายการ);
listUniq.removeAll (รายการ Uniq);
System.out.println(Arrays.toString(list.toArray()));
System.out.println(Arrays.toString(listUniq.toArray()));
-
อื่นๆก็เหมือนกับข้างบน
ความซับซ้อน:
ขณะเดินทาง วิธีการบรรจุจะถูกเรียกพร้อมกัน เราจะดูซอร์สโค้ดดังนี้:
คัดลอกรหัสรหัส ดังต่อไปนี้:
บูลีนสาธารณะมี (Object o) {
กลับดัชนีของ(o) >= 0;
-
ดัชนี int สาธารณะ (วัตถุ o) {
ถ้า (o == โมฆะ) {
สำหรับ (int i = 0; i <ขนาด; i++)
ถ้า (องค์ประกอบข้อมูล[i]==null)
ส่งคืนฉัน;
} อื่น {
สำหรับ (int i = 0; i <ขนาด; i++)
ถ้า (o.equals(elementData[i]))
ส่งคืนฉัน;
-
กลับ -1;
-
คุณจะเห็นได้ว่ามีการดำเนินการข้ามผ่านรายการใหม่แล้ว นั่นคือ 1+2+....+n ความซับซ้อนคือ O(n*n)
สรุปแล้ว:
โซลูชันที่ 1 มีประสิทธิภาพสูง กล่าวคือ ใช้ HashSet เพื่อดำเนินการขจัดข้อมูลซ้ำซ้อน