POJO类有20个对象的集合。我想编写一个返回具有不同值的对象的方法。现在这是我的Pogo课程
class Student {
private String firstName;
private String lastName;
public String getFirstName() {
return firstName;
}
public void setFirstName( String firstName ) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName( String lastName ) {
this.lastName = lastName;
}
}
现在我想要一些返回唯一姓氏值的方法。我无法理解我必须加入哪种逻辑。
答案 0 :(得分:1)
如果您使用的是Eclipse,可以右键单击源并选择Source> "生成hashCode()和equals()..."。这样做会产生这样的结果:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((firstName == null) ? 0 : firstName.hashCode());
result = prime * result + ((lastName == null) ? 0 : lastName.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 (firstName == null) {
if (other.firstName != null)
return false;
} else if (!firstName.equals(other.firstName))
return false;
if (lastName == null) {
if (other.lastName != null)
return false;
} else if (!lastName.equals(other.lastName))
return false;
return true;
}
然后,您将要将对象添加到Set的实例,可能是HashSet。听起来你可以随后返回填充的Set。
另见this。
编辑:请注意,我并不是建议将所有这些都放在学生班上。上面显示的代码在Student上,但是返回一组不同学生的方法会在其他地方进行。
编辑2:如果你只对唯一的姓氏感兴趣,你可以修改hashCode()和equals()以不考虑名字,但我承认这是非常不直观的,并建议在任何情况下避免这种情况而非学术活动。因此,更正确的可能是在仅考虑姓氏的Comparator实例上进行分层 - 请参阅doc和this。
答案 1 :(得分:0)
你可以使用Arraylist,它有一个名为.contains()的内置函数,它检查arrayList是否包含特定值。因此,您将创建一个姓氏的数组列表,如果数组列表中不存在,只需添加它。见http://docs.oracle.com/javase/1.5.0/docs/api/java/util/ArrayList.html#contains(java.lang.Object)
答案 2 :(得分:0)
如果您需要使用此字段了解对象(学生),则可以尝试使用Set,如果只需要一个字段,则使用Map。 如果你需要知道所有不同的学生(对:名字+姓氏),你需要覆盖getHashCode()和equals方法并使用HashSet,HashMap
答案 3 :(得分:0)
一个简单的方法(初学者)这样做就是创建一个新数组(输入数组的大小相同)。然后循环遍历数组,然后将每个值与数组中的每个其他值进行比较。如果找不到匹配项,请将此值放入新数组中。
伪码:
public static Student[] GetUniqueLastNames(Student[] students){
Student[] retArray;//new array
for(i = 0; i < students.size; i++){
unique = true
for(j=0; j < students.size; j++){
if(i != j){//make sure its not comparing the same value
if(students[i].lastname.equals(students[j].lastname)){
unique = false
break
}
}
}
if(unique){
retArray[i] = students[i]
}
}
return retArray
}
注意:有更好的方法可以做到这一点,但如果您正在学习Java(或一般的编程),这是一个很好的基本方法。
答案 4 :(得分:0)
如果您不关心保持对象的顺序,可以使用set:
public static <S extends Student> Collection<S> uniqByLastName(Collection<S> source){
TreeSet<S> result = new TreeSet<S>(new Comparator<S>() {
@Override
public int compare(S s1, S s2) {
return s1.getLastName().compareTo(s2.getLastName());
}
});
result.addAll(source);
return result;
}
如果您关心订单
public static <S extends Student> Collection<S> uniqByLastName(Collection<S> source){
Collection<S> result = new ArrayList<S>();
Set<String> addedStudents = new HashSet<String>();
for(S student : source){
String lastName = student.getLastName();
if(!addedStudents.contains(lastName)){
result.add(student);
addedStudents.add(lastName);
}
}
return result;
}
如果您想修改集合而不返回新的
public static <S extends Student> void uniqByLastName(Collection<S> source){
Set<String> addedStudents = new HashSet<String>();
Iterator<S> iterator = source.iterator();
while(iterator.hasNext()){
S student = iterator.next();
String lastName = student.getLastName();
if(addedStudents.contains(lastName)){
iterator.remove();
} else {
addedStudents.add(lastName);
}
}
}
答案 5 :(得分:0)
如果您使用的是Java 8,则可以使用lambda表达式来解决它。使用以下代码段可以解决您的问题:
list.stream()。collect(Collectors.toMap(Student :: getLastName,p - &gt; p,(p,q) - &gt; p))。values();
注意:它将返回具有给定姓氏的第一个学生,并且您可能已经猜到,您不需要覆盖equals和hashcode。