我试图了解如何在此程序中调用compareTo
方法。
class Student implements Comparable {
String dept, name;
public Student(String dept, String name) {
this.dept = dept;
this.name = name;
}
public String getDepartment() {
return dept;
}
public String getName() {
return name;
}
public String toString() {
return "[dept=" + dept + ",name=" + name + "]";
}
public int compareTo(Object obj) {
Student emp = (Student) obj;
System.out.println("Compare to : " +dept.compareTo(emp.getDepartment()));
int deptComp = dept.compareTo(emp.getDepartment());
return ((deptComp == 0) ? name.compareTo(emp.getName()) : deptComp);
}
public boolean equals(Object obj) {
if (!(obj instanceof Student)) {
return false;
}
Student emp = (Student) obj;
boolean ii = dept.equals(emp.getDepartment()) && name.equals(emp.getName());
System.out.println("Boolean equal :" +ii);
return ii ;
}
public int hashCode() {
int i2 = 31 * dept.hashCode() + name.hashCode();
System.out.println("HashCode :" + i2);
return i2;
}
}
public class CompareClass {
public static void main(String args[]) {
Student st[] = { new Student("Finance", "A"),
new Student("Finance", "B"), new Student("Finance", "C"),
new Student("Engineering", "D"),
new Student("Engineering", "E"),
new Student("Engineering", "F"), new Student("Sales", "G"),
new Student("Sales", "H"), new Student("Support", "I"), };
Set set = new TreeSet(Arrays.asList(st));
System.out.println(Arrays.asList(st));
System.out.println(set);
}
}
Arrays.asList(st)
?equals()
和hashcode()
的用途是什么?答案 0 :(得分:2)
为什么使用Arrays.asList(st)?
由于TreeSet
构造函数TreeSet(Collection c)接受Collection
而不是String[]
,因此您将String[]
转换为List
,即Collection
使用List asList(T... a)方法{{1}}。请注意,在这种情况下,数组与 varargs 相同。
equals()和hashcode()有什么用?
Object类提供了两种方法hashcode()和equals()来表示对象的身份。
您在代码中使用了TreeSet。根据{{3}}:
由集合维护的排序(无论是否提供显式比较器)必须与equals一致才能正确实现Set接口。 (有关与equals一致的精确定义,请参阅Comparable或Comparator。)这是因为Set接口是根据equals操作定义的,但是TreeSet实例使用compareTo(或compare)方法执行所有元素比较因此,从集合的角度来看,这种方法被视为相等的两个元素是相等的。
因此,在您的情况下,实施documentation并覆盖Comparable就足够了。
答案 1 :(得分:1)
.equals()是因为您要比较两个对象。
答案 2 :(得分:1)
我试图理解,在这个程序中如何调用compareTo方法。
因为您在这里使用的是TreeSet
,它实现SortedSet
,并且通过使用它们的自然顺序比较元素来计算唯一性,并且不相等。< / p>
实现自己的Comparable
或自己的超类的类可以相互比较。对于没有的课程,您可以提供Comparator
。
当你向SortedSet
添加一个元素时,该集合将首先将它与已经存在于集合中的元素进行比较,并且只有在没有比较给出时才添加它。参见下面的演示。
1.为什么使用Arrays.asList(st)?
因为这是Java 1.4代码。在Java 5中,您使用Arrays.asList(s1, s2, etc)
(即varargs方法)。
2.使用equals()和hashcode()是什么?
在这种情况下,没有。
示例程序(此次使用泛型)使用SortedSet
说明HashSet
和BigDecimal
之间的差异:
final BigDecimal one = BigDecimal.ONE;
final BigDecimal oneDotZero = new BigDecimal("1.0");
one.equals(oneDotZero); // false
one.compareTo(oneDotZero); // 0
// HashSet: uses .equals() and .hashCode();
final Set<BigDecimal> hashset = new HashSet<>();
hashset.add(one); hashset.add(oneDotZero);
hashset.size(); // 2
// TreeSet: uses Comparable
final Set<BigDecimal> treeset = new TreeSet<>();
treeset.add(one); treeset.add(oneDotZero);
treeset.size(); // 1
答案 3 :(得分:1)
Oracle文档中对Comparable接口有一个非常好的解释:http://docs.oracle.com/javase/6/docs/api/java/lang/Comparable.html
在这段代码中,Arrays.asList(st)的使用基本上是因为作者认为在Java中实例化一个Array并将其转换为List比创建一个ArrayList并为每个项调用.add更简单。但是,对于正在发生的事情来说,这并不是至关重要的。在同一行上发生的另一件事就是神奇的地方。
Set set = new TreeSet(Arrays.asList(st));
这将从列表中创建一个TreeSet。值得一看这篇文章:What is the difference between Set and List?。在Set中,所有元素都是唯一的,因此当您从包含重复项的List创建Set时,Set构造函数将抛出额外的项目。它如何确定哪些元素是重复的?它使用Comparable接口的方法。类似地,List被排序但Set不是这样,实现可以选择以最有效的顺序存储Set中的项。在TreeSet的情况下,它可以在Oracle documentation的顶部轻松解释它是如何做到的:
注意由一组维护的排序(无论是否显式 比较器提供)必须与equals一致,如果是的话 正确实现Set接口。 (参见可比较者或比较者 对于与equals一致的精确定义。)就是这样 因为Set接口是根据equals操作定义的, 但是TreeSet实例使用它执行所有元素比较 compareTo(或compare)方法,因此两个被认为相等的元素 从该集合的角度来看,通过这种方法是相等的。该 集合的行为即使其排序不一致也是明确定义的 与...平等它只是没有遵守集合的一般合同 接口
答案 4 :(得分:1)
一些Java API是围绕数组构建的,其中一些是围绕集合构建的。 asList基本上是一个适配器,可以像集合一样访问您的数组。
一些数据结构和算法对一段数据的“哈希”进行操作。这主要是出于性能原因。在大多数情况下,散列是表示特定对象的单个数字。您可以看到这对于快速排序集合或检查等效性有何用处。
当然,等于测试两个对象是否代表相同的东西。
答案 5 :(得分:0)
.equals和.hashcode是每个类从java继承自Object类的方法。 在创建自己的类时,通常会覆盖这两个默认实现,因为默认的Object函数通常不会导致所需的行为。
他们确实存在很好的衡量标准,但因为它们没有被使用。