4 回答

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個贊
您可以通過添加串聯(lián)的姓名、性別來創(chuàng)建靜態(tài)字符串哈希集。
class YourClass {
public static Set<String> studentSet = new HashSet<>();
public static void addStudent(String name, String gender) {
YourClass.studentSet.add(name + "," + gender);
}
public static Boolean studentExists(String name, String gender) {
return YourClass.studentSet.constains(name + "," + gender);
}
因此,您的 HashSet 中的數(shù)據(jù)將類似于 Tom,male 、Tom,female、John,male 。
class Student {
...
public Student(String name, String gender) {
this.name = name;
this.gender = gender;
YourClass.addStudent(name, gender);
}
}
在創(chuàng)建 Student 實(shí)例時,您可以檢查 HashSet 中是否沒有 Name、Gender,然后實(shí)例化和對象。
if(!YourClass.studentExists(name, gender)) {
Student student = new Student(name, gender);
}
我希望這能解決你的問題

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超9個贊
您可以創(chuàng)建一個類來控制對象的創(chuàng)建 - 基本上使用享元模式。
步驟 1. 將 Student 包的構(gòu)造函數(shù)設(shè)置為私有
public class Student {
Student(String name, String gender) {
...
步驟2.在Student中實(shí)現(xiàn)equals方法
public boolean equals (Object other) {
if (!(other instanceof Student)) return false;
Student otherStudent = (Student) other;
return Objects.equals(otherStudent.getName(), this.getName()) && Objects.equals(otherStudent.getGender(), this.getGender());
}
步驟 3. 在同一包中實(shí)現(xiàn) Student 對象池
public class StudentPool {
private List<Student> students = new ArrayList<>();
public Student getOrCreate(String name, String gender) {
Student student = new Student(name, gender);
return students.stream()
.filter(s -> Objects.equals(s, student))
.findFirst()
.orElseGet(() -> {
students.add(student);
return student;
});
}
public List<Student> get(String name) {
return students.stream()
.filter(student -> Objects.equals(student.getName(), name))
.collect(Collectors.toList());
}
}

TA貢獻(xiàn)1844條經(jīng)驗(yàn) 獲得超8個贊
假設(shè)您所說的“值”指的是學(xué)生的姓名,我建議您編寫一個小函數(shù),如果該姓名已被占用,該函數(shù)將返回 true。為此,您可以將所有“學(xué)生”存儲在 ArrayList 中:
ArrayList<Student> students = new ArrayList<Student>();
現(xiàn)在您可以將學(xué)生添加到此 ArrayList 中,如下所示:
private boolean nameIsAlreadyTaken(ArrayList<Student> students, String newName){
for (int i = 0; i < student.size(); i++){
if(students.get(i).getName().equals(newName)){
return true;
}
}
return false;
}
(您需要在學(xué)生類中定義一個 getName() 函數(shù)才能使其工作。)
那么你可以這樣做:
字符串 newName = "邁克爾"; String newGender = "男";
if (!nameIsAlreadyTaken(students, newName)){
students.add(new Student(newName, newGender));
} else{
//something you want to to if the name is already taken
}
您可以在不將 Students-ArrayList 傳遞給函數(shù)的情況下執(zhí)行此操作,但這取決于您。

TA貢獻(xiàn)1841條經(jīng)驗(yàn) 獲得超3個贊
我想說你需要重寫Student和equals方法hashCode,然后檢查構(gòu)造函數(shù)是否存在這樣的學(xué)生。關(guān)于這一點(diǎn)的好答案:鏈接。
import java.util.*;
public class Student {
private static final Set<Student> REGISTERED_STUDENTS = new HashSet<>();
private String name;
private String gender;
public static Collection<Student> getRegisteredStudents() {
return Collections.unmodifiableCollection(REGISTERED_STUDENTS);
}
public Student(final String name, final String gender) {
this.name = name;
this.gender = gender;
if (REGISTERED_STUDENTS.contains(this))
throw DuplicateStudentException();
REGISTERED_STUDENTS.add(this);
}
@Override
public int hashCode() {
return Objects.hash(name, gender);
}
@Override
public boolean equals(final Object o) {
if (this == o) return true;
if (!(o instanceof Student)) return false;
final Student student = (Student) o;
return Objects.equals(name, student.name) && Objects.equals(gender, student.gender);
}
}
請注意,這個示例不是線程安全的,并且使用了在構(gòu)造函數(shù)中拋出異常的有爭議的解決方案。您可能需要一個工廠方法和ConcurrentSkipListSet/或另一個線程安全集合,如下所示:
class Student {
private static final Set<Student> REGISTERED_STUDENTS = new ConcurrentSkipListSet<>(Comparator.comparing(Student::getName).thenComparing(Student::getGender));
private String name;
private String gender;
public static Set<Student> getRegisteredStudents() {
return Collections.unmodifiableSet(REGISTERED_STUDENTS);
}
public static void addStudent(final String name, final String gender) {
Student probablyExists = new Student(name, gender);
REGISTERED_STUDENTS.add(probablyExists);
}
private Student(final String name, final String gender) {
this.name = name;
this.gender = gender;
}
public String getName() {
return name;
}
public String getGender() {
return gender;
}
@Override
public int hashCode() {
return Objects.hash(name, gender);
}
@Override
public boolean equals(final Object o) {
if (this == o) return true;
if (!(o instanceof Student)) return false;
final Student student = (Student) o;
return Objects.equals(name, student.name) && Objects.equals(gender, student.gender);
}
}
添加回答
舉報