如何比较对象数组的值?

时间:2014-08-15 14:39:23

标签: java arrays oop pojo

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;
    }
}

现在我想要一些返回唯一姓氏值的方法。我无法理解我必须加入哪种逻辑。

6 个答案:

答案 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实例上进行分层 - 请参阅docthis

答案 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。