需要在java中解释这个程序

时间:2013-07-20 04:59:46

标签: java eclipse

我试图了解如何在此程序中调用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);
    }
}
  1. 为什么使用Arrays.asList(st)
  2. equals()hashcode()的用途是什么?

6 个答案:

答案 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. compareTo()
  2. Overriding equals and hashCode in Java
  3. Hashset vs Treeset

答案 1 :(得分:1)

使用

.equals()是因为您要比较两个对象。

答案 2 :(得分:1)

  

我试图理解,在这个程序中如何调用compareTo方法。

因为您在这里使用的是TreeSet,它实现SortedSet,并且通过使用它们的自然顺序比较元素来计算唯一性,并且相等。< / p>

实现自己的Comparable或自己的超类的类可以相互比较。对于没有的课程,您可以提供Comparator

当你向SortedSet添加一个元素时,该集合将首先将它与已经存在于集合中的元素进行比较,并且只有在没有比较给出时才添加它。参见下面的演示。

另见Collections.sort()

  

1.为什么使用Arrays.asList(st)?

因为这是Java 1.4代码。在Java 5中,您使用Arrays.asList(s1, s2, etc)(即varargs方法)。

  

2.使用equals()和hashcode()是什么?

在这种情况下,没有。


示例程序(此次使用泛型)使用SortedSet说明HashSetBigDecimal之间的差异:

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函数通常不会导致所需的行为。

他们确实存在很好的衡量标准,但因为它们没有被使用。