如何使用compareto()对Person对象数组进行排序?

时间:2010-04-01 03:58:51

标签: java sorting compareto

这是我的代码:

> import java.util.Scanner;
  import java.util.Arrays;

  /**
  This class tests the Person class.
  */
  public class PersonDemo
   {
    public static void main(String[] args)
    {
    int count = 0;
    Scanner in = new Scanner(System.in);

    boolean more = false;
    Person first = null;
    Person last = null;
    while (more)
    {
      System.out.println(
          "Please enter the person's name or a blank line to quit");
      String name = in.nextLine();

      if (name.equals(""))
       more = false;
      else
      {
       Person p = new Person(name); //new person object created with inputted name

       Person[] people = new Person[10]; //new array of 10 person objects
       people[count] = p; //declare person object with index of variable count as the new person object                            

       first = people[count];  // I have no idea what to do here.  This is where I'm stuck.
       last = people[count];   // I can't figure out what to do with this either.

       first.compareTo(p); //call compareTo method on first and new person object
       last.compareTo(p);  //call compareTo method on last and new person object     

       count++; // increase count variable
      }
     }

      System.out.println("First: " + first.toString()); 
      System.out.println("Last: " + last.toString());
     }
   }

Person类:

/**
  A person with a name.
*/
public class Person implements Comparable

{
 /**
  * Constructs a Person with a name.
  * @param aName the person's name
  */
 public Person(String aName)
 {
  name = aName;
 }

 public String getName()
 {
  return name;
 }

 @Override
 public int compareTo(Object otherObject) 
 {
  Person other = (Person)otherObject;
  if (name.compareTo(other.name) < 0) return -1;
  if (name.compareTo(other.name)  > 0) return 1;  
  return 0;
 }

 /**
        Returns a string representation of the object.
        @return name of Person
 */
 public String toString()
 {
  return "[name=" + name + "]";
   }

 private String name; 

}

3 个答案:

答案 0 :(得分:1)

您实际缺少的是compareTo是您为对象提供的功能。在您的示例中,您为Person实例提供了与其他Person进行比较的功能,以实现该类元素的总排序

通常这种方法被ListsSortedMaps等JDK集合隐含使用,但是你有一个数组,这是一种原始类型,所以你应该查看Arrays.sort(Object[]),它会使用Comparable界面对其进行排序。

提示:由于您的compareTo方法只适用于String的{​​{1}},因此您可以轻松返回其值,而不是检查它的行为方式是否相同。

答案 1 :(得分:0)

首先,在循环外部创建数组。其次,即使家庭作业说明他们只输入10个名字,你也应该假设更多 - 你只是要求那里的IndexOutOfBoundsExceptions。考虑使用像TreeSet这样自动排序的集合。

sort an array

Person[] people = new Person[10];
// add elements to the array...
java.util.Arrays.sort(people);
first = people[0];
// etc...

要对Collection进行排序(Set是一个没有重复的集合),只需使用TreeSet,它们就会自动排序。

TreeSet<Person> people = new TreeSet<Person>(); // using generics to say "only Person objects are allowed"
while (more) {
    System.out.println("Please enter the person's name or a blank line to quit");
    String name = in.nextLine();

    if (name.equals(""))
        more = false;
    else
        people.add(new Person(name));
}

System.out.println("First: " + people.first()); 
System.out.println("Last: " + people.last());

答案 2 :(得分:0)

嗯,首先,在最初将更多设置为true之前,您的代码将不会执行任何操作。否则,当您尝试在空对象上调用tostring时,您将只获得空指针异常。

另外,不要在while循环中创建person数组,否则每次都会重置,并且打败了存储所有人的目的。

另外,对于动物园类的对象foo和bar,你不能只做:

foo.compareto(bar);

这就像只有一行代码,如

-4;

Java不喜欢它。

所以,回答你的问题,使用比较方法,就像预先形成真值测验一样。例如

if(foo<bar)
     /*Do something*/;

除此之外,你可以使用.compareto()来实际比较对象,而不仅仅是引用。因此,您可以通过比较它们来确定动物园类型的哪个对象更大,foo或bar。用于比较的API规定如果返回0,则它们相等,如果返回正数,则第一个更大,如果返回负数,则第二个更大。所以:

if(foo.compareto(bar) >0)
    /* foo is greater*/;
else if(foo.compareto(bar) = 0)
    /* foo and bar are equal*/;
else
    /* bar is greater*/;