0

这是我的代码:

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

}
4

3 回答 3

1

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

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

提示:由于您的compareTo方法仅适用于String,因此Person您可以轻松地返回其值,而不是检查它是否以相同的方式运行。

于 2010-04-01T04:19:15.430 回答
0

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

数组进行排序

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

要对集合进行排序(集合是没有重复项的集合),只需使用 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());
于 2010-04-01T04:21:32.700 回答
0

好吧,首先,在您最初将 more 设置为 true 之前,您的代码不会做任何事情。否则,当您尝试在空对象上调用 tostring 时,您只会得到空指针异常。

另外,不要在 while 循环中创建 person 数组,否则它会每次都被重置,并且会破坏似乎存储所有人的目的。

此外,对于 zoo 类的对象 foo 和 bar,您不能只做:

foo.compareto(bar);

这就像只有一行代码

-4;

Java 不喜欢它。

因此,要回答您的问题,使用比较方法就像预成型真值测试。例如

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

除此之外,您可以使用 .compareto() 以便实际比较对象,而不仅仅是引用。因此,您可以通过将它们与 compare to 进行比较来确定 zoo 类型的哪个对象更大,foo 或 bar。compareto的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*/;
于 2010-04-01T04:23:27.447 回答