gpt4 book ai didi

java - 我能够在 TreeSet 中插入重复条目。如何克服这个

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:56:56 26 4
gpt4 key购买 nike

我有一个名为 Employee 的类,它的成员变量是 employeeNameemployeeId。我正在创建新的 Employee 对象,然后将其添加到 TreeSet 我想根据 employeeId 对其进行排序。但我认为,如果 2 个 Employee 对象具有相同的 employeeName,则它们是相等的。 Set 不允许重复。但在这里我可以观察到一个奇怪的行为。这是我的代码。(我在这里没有使用getters和setters。我直接访问成员变量。)

package secondOne;

import java.util.Set;
import java.util.TreeSet;

class Employee implements Comparable<Employee> {

String employeeName;
int employeeId;

public Employee(String name, int id) {
this.employeeName = name;
this.employeeId = id;
}

public int compareTo(Employee emp) {
//return this.employeeName.compareTo(emp.employeeName);
return (this.employeeId - emp.employeeId);
}

@Override
public String toString() {
return ("Name is: " + employeeName + " Emp id is: " + employeeId);
}

@Override
public boolean equals(Object emp) {
if (emp instanceof Employee && ((Employee) emp).employeeName == this.employeeName) {
return true;
}
return false;
}

}

public class TestingSetsWithComparable {
/**
* @param args
*/
public static void main(String[] args) {
Employee e1 = new Employee("A", 1);
Employee e2 = new Employee("A", 2);
Employee e3 = new Employee("B", 3);

Set<Employee> set = new TreeSet<Employee>();
set.add(e1);
set.add(e2);
set.add(e3);
System.out.println(set);
}
}

上面代码的输出是,
[名字是:A Emp id 是:1,名字是:A Emp id 是:2,名字是:B Emp id 是:3]

我的第一个问题是,在 equals() 方法中,如果 2 个 Employee 对象具有相同的 employeeName,我认为它们是相等的,但在 compareTo 方法中,我使用 employeeId 进行排序。在本例中,输出显示 employeeName“A”的 2 个条目。当我认为 2 个对象具有相同的 employeeName 时,TreeSet 如何允许重复条目。这怎么可能..?第二个问题是,在 compareTo 方法中,如果我使用 employeeName 进行排序,那么我不会得到相同名称的第二个重复条目。第二种情况的输出是
[名称为:A Emp id 为:1,名称为:B Emp id 为:3]

为什么会这样?

最佳答案

问题出在这里:

((Employee)emp).employeeName== this.employeeName

你必须比较String使用equals方法:

((Employee)emp).employeeName.equals(this.employeeName)

引用How do I compare strings in Java?

此外,由于您要覆盖 equals方法,如果你覆盖 hashCode 会很好方法,如 Object#equals 中所述契约(Contract):

Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.

附加:由于您使用的是 TreeSet , 它将使用 compareTo方法而不是 equalshashCode方法。这是因为 TreeSet工具 SortedSet界面。引用 SortedSet javadoc(强调我的):

A Set that further provides a total ordering on its elements. The elements are ordered using their natural ordering(i.e. implementing Comparable<T>), or by a Comparator typically provided at sorted set creation time.

你应该根据你的需要实现这个方法:

public int compareTo(Employee emp) {
if (this.employeeName.equals(emp.employeeName)) {
return 0;
}
//removed the comparison by subtraction since it will behave wrongly on int overflow
return new Integer(this.employeeId).compareTo(emp.employeeId);
}

由于您要比较字符串,我建议使用 StringUtils 来自 Apache Commons Lang 的类(class)提供帮助方法来避免 null支票和其他。

关于java - 我能够在 TreeSet 中插入重复条目。如何克服这个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17608422/

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