gpt4 book ai didi

java - HashSet - 确保早期对象持久化

转载 作者:行者123 更新时间:2023-12-02 06:01:50 25 4
gpt4 key购买 nike

我必须使用可能插入大量重复值的HashSet。但是当稍后的插入产生重复时,我想保留插入到哈希中的早期数据。为了检查这一点,我编写了以下代码并插入了许多重复值,但它并不令我满意。请参阅下面的代码 -

import java.util.HashSet;
import java.util.Set;

public class SetTest {

private static Set<Student> studentSet = new HashSet<Student>();
private static Student s1, s2, s3, s4, s5, s6, s7, s8, s9;

public static void main(String args[]){

s1 = new Student(1, 1, "Syeful", "first boy");
s2 = new Student(2, 2, "Razib", "no comments");
s3 = new Student(3, 3, "Bulbul", "should remain");
s4 = new Student(4, 3, "Bulbul", "should not remain");
s5 = new Student(5, 4, "Bulbul", "should remain");
s9 = new Student(9, 5, "Proshanto", "kaka - my favourite");

studentSet.add(s1);
studentSet.add(s2);
studentSet.add(s3);
studentSet.add(s4);
studentSet.add(s5);
studentSet.add(s9);

for(Student each : studentSet){
System.out.println("SrNo: " +each.getSrNo()+ " roleNo: "
+each.getRoleNo()+ " name: " +each.getName()+
" coment: " +each.getComment());
}
}

}

class Student{

private int srNo;
private int roleNo;
private String name;
private String comment;

public Student(int srNo, int role, String name, String comment) {
super();
this.srNo = srNo;
this.roleNo = role;
this.name = name;
this.comment = comment;
}

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + roleNo;
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (!(obj instanceof Student)) {
return false;
}
Student other = (Student) obj;
if (name == null) {
if (other.name != null) {
return false;
}
} else if (!name.equals(other.name)) {
return false;
}
if (roleNo != other.roleNo) {
return false;
}
return true;
}

public int getSrNo() {
return srNo;
}

public int getRoleNo() {
return roleNo;
}

public String getName() {
return name;
}

public String getComment() {
return comment;
}
}

输出是:

Set Size: 5
SrNo: 9 roleNo: 5 name: Proshanto coment: kaka - my favourite
SrNo: 2 roleNo: 2 name: Razib coment: no comments
SrNo: 1 roleNo: 1 name: Syeful coment: first boy
SrNo: 5 roleNo: 4 name: Bulbul coment: should remain
SrNo: 3 roleNo: 3 name: Bulbul coment: should remain

看来我在提问之前先澄清一些观点,这样我才能正确解释并澄清我的理解。

  • 我想根据roleNoname保持'Student'的唯一性。这就是hashCode()和equals()角色组成的原因有了这些属性(property)。因此,根据此实现,即使 s3 和 s4 的 commentsrNo 属性彼此不同,它们也是彼此重复的。

  • HashSet 是无序的。

  • 当 s4 添加到集合中时,我们可以从输出中看到 s4 被从集合中丢弃,而 s3 保留下来。

  • 假设我想添加学生的另一个对象 s100 = new Student(3, 3, "Bulbul", "earlier instance irresulated"); 这是 s3 的副本。让我们在插入 s100 之前插入大量 s3 的重复项。

问题:
由于集合未排序并且集合中不存在重复剂量,因此是否有可能 s3 被 s100 删除?我想保留较早的对象并丢弃较晚的对象。少量的数据并不能澄清事实。我认为在这种情况下可以使用排序的Set。但是 HashSet 能达到这个目的吗?

提前致谢。

最佳答案

HashSet.add(E e)如果集合已包含指定元素,则保持集合不变。因此,s3 不会被 s100 删除。

关于java - HashSet - 确保早期对象持久化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26668814/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com